//
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<climits>
using namespace std;
const int maxn=1100;
struct Point
{
double x,y;
int peo;
};
int n;
Point pi[maxn];
double a[maxn][maxn];
double dis(Point h,Point k)
{
double dx=h.x-k.x;
double dy=h.y-k.y;
return sqrt(dx*dx+dy*dy);
}
int vis[maxn];
double lowc[maxn];
int pre[maxn];
int total1,total2;
struct Node
{
int t;
int next;
};
Node G[maxn*3];
int tp[maxn];
int tl;
void init()
{
tl=0;
memset(tp,-1,sizeof(tp));
}
void addedge(int u,int t)
{
G[tl].t=t;
G[tl].next=tp[u];
tp[u]=tl++;
}
int tx,ty;
void dfs(int u,int fath)
{
vis[u]=1;total1=max(total1,pi[u].peo);
for(int i=tp[u];i!=-1;i=G[i].next)
{
int t=G[i].t;
if(t==fath) continue;
if(tx==u&&ty==t) continue;
if(tx==t&&ty==u) continue;
dfs(t,u);
}
}
int main()
{
int ci;scanf("%d",&ci);
while(ci--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%lf%lf%d",&pi[i].x,&pi[i].y,&pi[i].peo);
for(int i=0;i<n;i++) for(int j=i;j<n;j++)
{
a[i][j]=a[j][i]=dis(pi[i],pi[j]);
}
int p;
double minc,res=0;
const int inf=INT_MAX;
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));pre[0]=-1;
vis[0]=1;
for(int i=0;i<n;i++) lowc[i]=a[0][i];
int flag=0;
for(int l=1;l<n;l++)
{
minc=inf;p=0;
for(int i=0;i<n;i++)
{
if(vis[i]==0&&minc>lowc[i])
{
minc=lowc[i];
p=i;
}
}
if (inf == minc) {flag=1; break;} // 原图不连通
vis[p]=1;res+=minc;
for(int i=0;i<n;i++)
{
if(vis[i]==0&&lowc[i]>a[p][i]) lowc[i]=a[p][i],pre[i]=p;
}
}
init();
for(int i=1;i<n;i++)
{
addedge(i,pre[i]);
addedge(pre[i],i);
}
//...............
double _max=0;
for(int i=1;i<n;i++)
{
int s=i,t=pre[i];
tx=s,ty=t;
double d=a[s][t];
total1=total2=0;
memset(vis,0,sizeof(vis));
dfs(0,-1);
for(int j=0;j<n;j++)
{
if(vis[j]) continue;
total2=max(total2,pi[j].peo);
}
double tmp=(total1+total2)/(res-d);
_max=max(_max,tmp);
}
printf("%.2lf\n",_max);
}
return 0;
}