1. 


/* Angewandte Mathematik, SS09, IFB 2C
* ACM Problem #10034 (Freckles)
* Link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&page=show_problem&problem=975
*
* @author Dennis Wilfert
* @author Johann Studt
* @version 1.0, 06/30/2009
*
* Status : Accepted
* Runtime: 0.164
*/


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.Comparator;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// Anzahl der Testfälle
int cases =Integer.parseInt(reader.readLine());

StringTokenizer token;
// Eingelesenen Koordinaten
double[][] coordinates;
// Abstand zwischen zwei Punkten
double[][] node;

int k;
double sum, temp;

while(cases>0){
// Leere Zeile lesen
reader.readLine();
// Array mit der Rrichtigen Größe anlegen
coordinates = new double[Integer.parseInt(reader.readLine())][3];

// Koordinaten in das Array eintragen
for(int i = 0; i < coordinates.length; i++){
token = new StringTokenizer(reader.readLine());
coordinates[i][0] = Double.parseDouble(token.nextToken());
coordinates[i][1] = Double.parseDouble(token.nextToken());
// Zu jeder Koordinate eine Zahl festlegen
coordinates[i][2] = i;
}
// Array für sämtliche mögliche Abstandskombinationen
node = new double[(coordinates.length*(coordinates.length-1))/2][3];
k = 0;
// Alle Kombinationen berechnen
for(int i = 0; i < coordinates.length; i++)
for(int j = i+1; j < coordinates.length; j++){
// Erster Punkt
node[k][0] = i;
// Zweiter Punk
node[k][1] = j;
// Abstand der beiden Punkte berechnen
node[k][2] = (Math.pow((coordinates[j][1]-coordinates[i][1]), 2) + Math.pow((coordinates[j][0]-coordinates[i][0]), 2));
k++;
}
// 2-Dimensionales Array nach dem Abstand der Punkte Sortieren
Arrays.sort(node, new Comparator(){
public int compare(Object o1, Object o2) {
double[] d1 = (double[])o1;
double[] d2 = (double[])o2;
if(d1[2]>d2[2]) return 1;
else if(d1[2]<d2[2]) return -1;
else return 0;
}
});

// Summe der Abstände
sum = 0;

// Array mit den Abständen durchlaufen
for(int i=0; i<node.length; i++){
// Sind die Werte an den beiden Positionen unterschiedlich wird
// der erste Wert gesucht und durch den zweiten ersetzt sowie der Abstand zur Summe addiert,
// bis nur noch immer der selbe Wert in coordinates[][2] steht, dann wurde
// der kürzeste Weg gefunden.
if(coordinates[(int)node[i][0]][2]!=coordinates[(int)node[i][1]][2]){
temp=coordinates[(int)node[i][0]][2];
// Array mit den Koordinaten durchlaufen
for(int j=0; j<coordinates.length ;j++)
if(coordinates[j][2]==temp)
coordinates[j][2]=coordinates[(int)node[i][1]][2];
// Wert dazuaddieren
sum+=Math.sqrt(node[i][2]);
}

}

// Gerundete Ausgabe
DecimalFormat df = new DecimalFormat();
df.applyPattern( "######0.00" );
System.out.println(df.format(sum));

cases--;
if(cases!=0)System.out.println();
}

}
}