/*
  Author: Slobodan Mitrovic
  e-mail: boba5555@gmail.com
  date: 03.06.2009.
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define ffor(_a,_f,_t) for(int _a=(_f),__t=(_t);_a<__t;_a++)
#define all(_v) (_v).begin() , (_v).end()
#define sz size()
#define pb push_back
#define SET(__set, val) memset(__set, val, sizeof(__set))
#define FOR(__i, __n) ffor (__i, 0, __n)
#define sqr(a) ((a) * (a))

using namespace std;

const double EPS = 1e-10;

double a[102], b[102], r[102], R;
int n;

struct tDot{
  double x, y;
  bool ex;
  tDot(){
  }
  
  tDot(double _x, double _y, bool _ex){
    x = _x;
    y = _y;
    ex = _ex;
  }
};

tDot ret1, ret2, ret3, ret4;

void findIntersect(int idx1, int idx2){
  ret1.ex = ret2.ex = ret3.ex = ret4.ex = false;
  double va = -a[idx1], vb = -b[idx1];
  
  double c = sqr(a[idx2] + va) + sqr(r[idx1]) + sqr(b[idx2] + vb) - sqr(r[idx2]);
  
  double A = 4.0 * sqr(a[idx2] + va) + 4.0 * sqr(b[idx2] + vb);
  double B = -4.0 * (a[idx2] + va) * c;
  double C = sqr(c) - 4.0 * sqr(b[idx2] + vb) * sqr(r[idx1]);
  double D = sqr(B) - 4.0 * A * C;
  
  if (fabs(A) < EPS || (fabs(D) > EPS && D < 0.0))
    return;
    
    
  double x1 = (-B + sqrt(D)) / (2.0 * A);
  double x2 = (-B - sqrt(D)) / (2.0 * A);
  
  double y1, y2;
  if (sqr(r[idx1]) >= sqr(x1)){
    y1 = sqrt(sqr(r[idx1]) - sqr(x1));
    
    if (sqr(r[idx2]) - sqr(x1 - (a[idx2] + va)) - sqr(y1 - (b[idx2] + vb)) <= EPS){
      ret1.ex = true;
      ret1.x = x1 - va;
      ret1.y = y1 - vb;
    }
    y1 = -y1;

    if (sqr(r[idx2]) - sqr(x1 - (a[idx2] + va)) - sqr(y1 - (b[idx2] + vb)) <= EPS){
      ret3.ex = true;
      ret3.x = x1 - va;
      ret3.y = y1 - vb;
    }
  }

  if (sqr(r[idx1]) >= sqr(x2)){
    y2 = sqrt(sqr(r[idx1]) - sqr(x2));
    
    if (sqr(r[idx2]) - sqr(x2 - (a[idx2] + va)) - sqr(y2 - (b[idx2] + vb)) <= EPS){
      ret2.ex = true;
      ret2.x = x2 - va;
      ret2.y = y2 - vb;
    }
    
    y2 = -y2;

    if (sqr(r[idx2]) - sqr(x2 - (a[idx2] + va)) - sqr(y2 - (b[idx2] + vb)) <= EPS){
      ret4.ex = true;
      ret4.x = x2 - va;
      ret4.y = y2 - vb;
    }

  }
}

double dist(double x1, double y1, double x2, double y2){
  return sqrt(sqr(x1 - x2) + sqr(y1 - y2));
}

int cnt(tDot dot){
  int ret = 0;
  FOR (i, n)
    if (dist(dot.x, dot.y, a[i], b[i]) + r[i] < R + EPS)
      ret++;
  return ret;
}

int ret = 0;

void updateRet(tDot dot){
  if (!dot.ex)
    return;
  
  ret >?= cnt(dot);
}

int main(){
	freopen("tabla.in", "rt", stdin);
	freopen("tabla.out", "wt", stdout);
	scanf("%d", &n);
	FOR (i, n)
	 scanf("%lf %lf %lf", &a[i], &b[i], &r[i]);
	
	scanf("%lf", &R);
	FOR (i, n){
    if (r[i] <= R)
      updateRet(tDot(a[i], b[i], true));
      
    if (r[i] >= R)
      continue;
      
    ffor (j, i + 1, n){
      if (r[j] >= R)
        continue;
        
      a[100] = a[i];
      b[100] = b[i];
      r[100] = R - r[i];
      
      a[101] = a[j];
      b[101] = b[j];
      r[101] = R - r[j];

      findIntersect(100, 101);
      updateRet(ret1);
      updateRet(ret2);
      updateRet(ret3);
      updateRet(ret4);
      
    }
  }
	
	printf("%d \n", ret);	
	return 0;
}
