#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define N_BIT (1<<24)

#define isDeleted(i,s) (s & (1<<i)) ? 1:0
#define removeDisc(i,j,s) (s | (1<<i) | (1<<j))
#define max(x,y) (x>y) ? x:y


typedef struct data{
	int x;
	int y;
	int r;
	int c;
	int st;		//??????????????????1,????????§???????????°0
}disc;

int n;				//Disc????????°
int max;		//?????????????????°????????§???
int dp[N_BIT];		//????????¶????????????????????????????????°????????§??????????´?????????????(?????¢?´¢?????´??????-1)
disc* d;			//Disc???????´?????????????


double discDistance(int i,int j){		//i,j?????????Disc????????¢?????????
	disc s = d[i];
	disc t = d[j];
	return ((s.x-t.x)*(s.x-t.x) + (s.y-t.y)*(s.y-t.y));
}

int isRemovable(int i,int j,int s){			//??¶???s????????????i?????????Disc?????????????????§?????????
	int k;
	for(k=i-1;k>=0;k--){
		if(d[k].st){		//k???????????¢??????????????????????£???°???
			continue;
		}
		if((d[i].r + d[k].r)*(d[i].r + d[k].r) > discDistance(i,k)){		//?????¢?????¢???????????????
			return 0;
		}
	}
	for(k=j-1;k>=0;k--){
		if(d[k].st){		//k???????????¢??????????????????????£???°???
			continue;
		}
		if((d[j].r + d[k].r)*(d[j].r + d[k].r) > discDistance(j,k)){		//?????¢?????¢???????????????
			return 0;
		}
	}
	return 1;
}

void initDP(){		//dp??????????????????
	int i;
	for(i=0;i<N_BIT;i++){
		dp[i] = -1;			//??¨????????¢?´¢??¨??????
	}
}

//??±???????????¢?´¢(?????¢????????°)
int dfsearch(int s){		//s?????¶????????????
	if(dp[s] != -1){		//??¶???s?????¢?????¢?´¢????????§????????°?¨?????????????
		return dp[s];
	}
	int i,j,value=0;
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			//??¶???s????????????i,j?????????Disc???????????????Disc???????????£????????????,??????????????§??????,?????????i,j??????????????????????????´???
			if(isRemovable(i,j,s) && !d[i].st && !d[j].st && d[i].c == d[j].c){
				d[i].st = d[j].st = 1;
				value = max(value,dfsearch(removeDisc(i,j,s))+2);		//i,j???2???????????? + i,j????????????????????\?????§????????§????????¢?´¢??§?±???????
				d[i].st = d[j].st = 0;
			}
		}
	}
	return dp[s] = value;
}

int main(void){
	int i;
	while(1){
		scanf("%d",&n);
		if(n == 0){
			break;
		}
		d = (disc*)malloc(n*sizeof(disc));		//Disc?????????
		for(i=0;i<n;i++){
			scanf("%d %d %d %d",&d[i].x,&d[i].y,&d[i].r,&d[i].c);
			d[i].st = 0;
		}
		initDP();		//??¢?´¢??????????????????
		printf("%d\n",dfsearch(0));		//s=0:??¨??????Disc????????¨????????¶???
	}
	return 0;
}