#include<stdio.h>

#include<string.h>
#define max(x,y) ((x)<(y)?(y):(x))
#define REP(i,j,n) for(int i=(j);(i)<(n);(i)++)
#define rep(i,n) for(int i=0;(i)<(n);(i)++)
int n;
int x[25],y[25],c[25],r[25];
int b[25];
char dp[1<<24];
int power(int x,int n){
    int ans=1;
    rep(i,n) ans*=x;
    return ans;
}
int intersects(int i,int j){
    int dist1=power(x[i]-x[j],2)+power(y[i]-y[j],2);
    int dist2=power(r[i]+r[j],2);
    return dist2 > dist1;
}
int main(){
    int n;
    while(1){
        scanf("%d",&n);
        if(n==0) break;
        rep(i,n){
            scanf("%d%d%d%d",&x[i],&y[i],&r[i],&c[i]);
            b[i]=0;
            rep(j,i) if(intersects(i,j)) b[i]|=(1<<j);
        }
        int ans=0;
        int to=(1<<n);
        memset(dp,-1,sizeof(dp));
        dp[0]=0;
        rep(i,to){
            if(dp[i]==-1) continue;
            ans=max(ans,(int)dp[i]);
            //消せる円盤のペア(j,k)を探す
            rep(j,n-1){
                //すでに円盤jは消えている or 円盤jの上の円盤が邪魔して消せない
                if((i & (1<<j)) != 0 || (i & b[j]) != b[j]) continue;
                
                for(int k=j+1;k<n;k++){
                    //jとkの色が違う or すでに円盤kは消えている or 円盤kの上の円盤が邪魔
                    if(c[j] != c[k] || (i & (1<<k)) != 0 || (i & b[k]) != b[k]) continue;
                    //next = 円盤jとkを消した状態(ビット管理)
                    int next = i | (1<<j) | (1<<k);
                    dp[next] = max((int)dp[next],dp[i]+2);
                }
            }
        }
        printf("%d\n",ans);
    }
}

