#include<bits/stdc++.h>
typedef long long int LL;
using namespace std;
const int N = 2333+7;
const int INF = (~(1<<31))>>1;
int x[N],y[N],r[N],c[N];
int dfn[N],low[N],color[N];
int vis[N],cnt,tot;//(1为在栈中,2为已访问,且不在栈中,0为不在,没访问过)
int cost[N],deg[N];
int mystack[N],len;
vector<int>G[N];
void dfs(int u){
dfn[u]=low[u]=++cnt;//时间点
vis[u]=1;//标记
mystack[++len]=u;//入栈
int gz=G[u].size();
for(int i=0,to;i<gz;i++){
to=G[u][i];
if(vis[to]==0)dfs(to);//没访问过
if(vis[to]==1)low[u]=min(low[u],low[to]);//与子树更新最小值
}
if(dfn[u]==low[u]){//联通块
++tot;int j;
do{
j=mystack[len--];
cost[tot]=min(cost[tot],c[j]);//最小花费
color[j]=tot;//联通块的编号 缩点
vis[j]=2;//标记 已访问
}while(j!=u);//回溯
}
}
LL dis(LL x){return x*x;}
bool judge(int i,int j){//i与j之间的据离与i的半径比较
return dis(x[i]-x[j])+dis(y[i]-y[j])<=dis(r[i]);
}
int n;
int main(){
int _,kcase=0;scanf("%d",&_);
while(_--){
tot=cnt=len=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d%d%d",&x[i],&y[i],&r[i],&c[i]);
for(int i=1;i<=n;i++){cost[i]=INF,deg[i]=vis[i]=0;
for(int j=1;j<=n;j++){
if(i==j) continue;//构图
if(judge(i,j))G[i].push_back(j);
}
}
for(int i=1;i<=n;i++) if(vis[i]==0) dfs(i);
for(int i=1;i<=n;i++){//染色
int gz=G[i].size();
for(int j=0,to;j<gz;j++){
to=G[i][j];
if(color[i]!=color[to])//编号不相等 不在同一个环
deg[color[to]]++;//i-->to to顶点入度++
}
}
int ans=0;
for(int i=1;i<=tot;i++)//联通快
{if(deg[i]==0) ans+=cost[i];//入度为零 需引爆
printf("Case #%d: %d\n",++kcase,ans);
for(int i=1;i<=n;i++) G[i].clear();
}
return 0;
}