const int MM = 1000+5;
#define debug puts("wrong")
#define inf 1000000
#define mod 1000000007
int N,M,K, L;
int g=1; void printcase() {printf("Case %d: ",g++);}
struct Point{
int x,y,r;
bool friend operator<(Point a,Point b) {
return a.r<b.r;
}
}num1[MM],num2[MM];
Point start, end;
int cnt1, cnt2;
int sqr(int x) {
return (x)*(x);
}
int dis(Point a,Point b) {
int tmp=sqr(a.x-b.x)+sqr(a.y-b.y);
return tmp;
}
bool ok(Point a) {
int t1=dis(a,end),t2=dis(a,start),rr=sqr(a.r);
if(t1==rr) return false;
if(t2==rr) return false;
if(t2>rr && t1<rr) return true;
return false;
}
bool ok1(Point a) {
int t1=dis(a,end),t2=dis(a,start),rr=sqr(a.r);
if(t1==rr) return false;
if(t2==rr) return false;
if(t2<rr && t1>rr) return true;
return false;
}
bool in(Point a,Point b) {
int t1=dis(a,b), rr=sqr(a.r-b.r);
return t1<rr;
}
bool out(Point a,Point b) {
int t1=dis(a,b), rr=sqr(a.r+b.r);
return t1>rr;
}
void get_data() {
int i,j,k; Point tmp;
start.x=0, start.y=0;
scanf("%d%d%d",&N,&end.x,&end.y);
for(i=cnt1=cnt2=0;i<N;i++) {
scanf("%d%d%d",&tmp.x,&tmp.y,&tmp.r);
if(ok1(tmp)) {
num1[cnt1++]=tmp;
}
if(ok(tmp)) num2[cnt2++]=tmp;
}
// printf("**%d %d**\n",cnt1,cnt2);
}
int dp1[MM], dp2[MM];
void solve() {
int i,j,k,tmp;
printcase();
for(i=0;i<MM;i++) dp1[i]=dp2[i]=1;
// sort(num1,num1+cnt1);
for(i=0;i<cnt1;i++) {
for(j=tmp=0;j<cnt1;j++) {
if(i==j) continue;
if(in(num1[i],num1[j])) {
if(num1[i].r>num1[j].r) tmp=max(tmp,dp1[j]);
}
dp1[i]=tmp+1;
}
}
// sort(num2,num2+cnt2);
for(i=0;i<cnt2;i++) {
for(j=tmp=0;j<cnt2;j++) {
if(i==j) continue;
if(in(num2[i],num2[j])) {
if(num2[i].r>num2[j].r) tmp=max(tmp,dp2[j]);
}
dp2[i]=tmp+1;
}
}
int ans=0;
// for(i=0;i<cnt1;i++) printf("**%d ",dp1[i]); printf("\n");
// for(i=0;i<cnt2;i++) printf("**%d ",dp2[i]); printf("\n");
for(i=0;i<cnt1;i++) ans=max(ans,dp1[i]);
for(i=0;i<cnt2;i++) ans=max(ans,dp2[i]);
for(i=0;i<cnt1;i++) {
for(j=0;j<cnt2;j++) {
if(out(num1[i],num2[j])) ans=max(ans,dp1[i]+dp2[j]);
}
}
printf("%d\n",ans);
}