#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
const int Max=1001;
vector <vector <double> > mat;
vector <double> dist;
vector <bool> visited;
int n;
int minVertex()
{
int next=-1;
for (int i=0;i<n;i++)
{
if (visited[i]==false && (next==-1 || dist[i]<dist[next]))
{
next = i;
}
}
return next;
}
double Prim()
{
dist=mat[0];
fill(visited.begin(),visited.end(),false);
visited[0]=true;
double cost=0;
int i;
bool flag=true;
for(i=1;i<n;i++)
{
int next=minVertex();
visited[next]=true;
if (dist[next]==Max) //不连通
{
flag=false;
break;
}
cost+=dist[next];
for (int j=0;j<n;j++)
{
if (visited[j]==false && mat[next][j]<dist[j])
{
dist[j]=mat[next][j];
}
}
}
if (flag==false)
return -1;
else
return cost;
}
struct Position
{
int x,y;
};
vector <Position> islands;
double dist2Pos(Position a,Position b)
{
return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
void run()
{
scanf("%d",&n);
islands.resize(n);
int i;
for(i=0;i<n;i++) scanf("%d %d",&islands[i].x,&islands[i].y);
mat.resize(n);
visited.resize(n);
for(i=0; i<n; i++)
{
mat[i].resize(n);
fill(mat[i].begin(),mat[i].end(),Max);
mat[i][i]=0;
}
for(i=0; i<n; i++)
{
for(int j=0;j<n;j++)
{
double d=dist2Pos(islands[i],islands[j]);
if (d>=10 && d<=1000)
{
mat[i][j]=d;
mat[j][i]=d;
}
}
}
double cost=Prim();
if (cost!=-1)
printf("%.1lf/n",cost*100);
else
printf("oh!/n");
}
int main()
{
int total;
scanf("%d",&total);
for(int now=1; now<=total; now++) run();
return 0;
}