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

#define repl(i,a,b) for(i=(int)(a);i<(int)(b);i++)
#define rep(i,n) repl(i,0,n)
#define max(x,y) x>y?x:y

#define bool int
#define false 0
#define true 1

int n;
int x[111],y[111],r[111],c[111];
bool used[111];
char mem[1<<24];

bool judge(int i,int j){
	bool ok=true;
	int k;
	rep(k,i){
		if(used[k])continue;
		if(pow(x[i]-x[k],2)+pow(y[i]-y[k],2)<pow(r[i]+r[k],2))ok=false;
	}
	rep(k,j){
		if(used[k])continue;
		if(pow(x[k]-x[j],2)+pow(y[k]-y[j],2)<pow(r[k]+r[j],2))ok=false;
	}
	return ok;
}

int dfs(int v){
	if(mem[v]!=-1)return mem[v];
	int res=0;
	int i,j;
	rep(i,n)repl(j,i+1,n){
		if(!used[i]&&!used[j]&&c[i]==c[j]&&judge(i,j)){
			used[i]=used[j]=true;
			res=max(res,dfs(v|(1<<i)|(1<<j))+2);
			used[i]=used[j]=false;
		}
	}
	return mem[v]=res;
}

int main(){
	//cin.sync_with_stdio(false);
	while(1){
		scanf("%d",&n);
		if(n==0)break;
		int i;
		rep(i,n)scanf("%d%d%d%d",x+i,y+i,r+i,c+i);
		memset(used,0,sizeof(used));
		memset(mem,-1,sizeof(mem));
		printf("%d\n", dfs(0));
	}
	return 0;
}