#include <bits/stdc++.h>
using namespace std;
#define int double
#define endl "\n"
struct Edge {
int u, v;
double weight;
bool operator<(const Edge &other) const {
return weight < other.weight;
}
};
double dis(pair<double,double> a, pair<double,double> b){
return sqrt(pow(a.first - b.first, 2) + pow(a.second - b.second, 2));
}
int find(int x, vector<int> par){
if(par[x] == x)return x;
return find(par[x], par);
}
bool join(int x, int y, vector<int> par){
int u = find(x, par), v = find(y, par);
if(u == v)return false;
return true;
}
double kruska(int n, vector<pair<double,double>> &points){
vector<Edge> edges;
vector<int> par(n + 1);
for(int i = 0; i < n; i++){
par[i] = i;
for(int j = i + 1; j < n; j++){
edges.push_back({i,j,dis(points[i], points[j])});
}
}
sort(edges.begin(), edges.end());
int cnt = 0;
double sum = 0.00;
for(int i = 0; i < edges.size(); i++){
if(join(edges[i].u, edges[i].v,par)){
par[edges[i].v] = edges[i].u;
sum += edges[i].weight;
cnt++;
if(cnt == n - 1)break;
}
}
return sum;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int tc;cin >> tc;
string s; getline(cin, s);
while(tc--){
int n; cin >> n;
vector<pair<double,double>> points(n);
for(int i = 0; i < n; i++){
cin >> points[i].first >> points[i].second;
}
double result = kruska(n ,points);
cout << fixed << setprecision(2) << result << endl << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGludCBkb3VibGUKI2RlZmluZSBlbmRsICJcbiIKCnN0cnVjdCBFZGdlIHsKICAgIGludCB1LCB2OwogICAgZG91YmxlIHdlaWdodDsKICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEVkZ2UgJm90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHdlaWdodCA8IG90aGVyLndlaWdodDsKICAgIH0KfTsKCmRvdWJsZSBkaXMocGFpcjxkb3VibGUsZG91YmxlPiBhLCBwYWlyPGRvdWJsZSxkb3VibGU+IGIpewoJcmV0dXJuIHNxcnQocG93KGEuZmlyc3QgLSBiLmZpcnN0LCAyKSArIHBvdyhhLnNlY29uZCAtIGIuc2Vjb25kLCAyKSk7Cn0KCmludCBmaW5kKGludCB4LCB2ZWN0b3I8aW50PiBwYXIpewoJaWYocGFyW3hdID09IHgpcmV0dXJuIHg7CglyZXR1cm4gZmluZChwYXJbeF0sIHBhcik7Cn0KCmJvb2wgam9pbihpbnQgeCwgaW50IHksIHZlY3RvcjxpbnQ+IHBhcil7CglpbnQgdSA9IGZpbmQoeCwgcGFyKSwgdiA9IGZpbmQoeSwgcGFyKTsKCWlmKHUgPT0gdilyZXR1cm4gZmFsc2U7CglyZXR1cm4gdHJ1ZTsKfQoKZG91YmxlIGtydXNrYShpbnQgbiwgdmVjdG9yPHBhaXI8ZG91YmxlLGRvdWJsZT4+ICZwb2ludHMpewoJdmVjdG9yPEVkZ2U+IGVkZ2VzOwoJdmVjdG9yPGludD4gcGFyKG4gKyAxKTsKCQoJZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CgkJcGFyW2ldID0gaTsKCQlmb3IoaW50IGogPSBpICsgMTsgaiA8IG47IGorKyl7CgkJCWVkZ2VzLnB1c2hfYmFjayh7aSxqLGRpcyhwb2ludHNbaV0sIHBvaW50c1tqXSl9KTsKCQl9Cgl9CgkKCXNvcnQoZWRnZXMuYmVnaW4oKSwgZWRnZXMuZW5kKCkpOwoJCglpbnQgY250ID0gMDsKCWRvdWJsZSBzdW0gPSAwLjAwOwoJCglmb3IoaW50IGkgPSAwOyBpIDwgZWRnZXMuc2l6ZSgpOyBpKyspewoJCWlmKGpvaW4oZWRnZXNbaV0udSwgZWRnZXNbaV0udixwYXIpKXsKCQkJcGFyW2VkZ2VzW2ldLnZdID0gZWRnZXNbaV0udTsKCQkJc3VtICs9IGVkZ2VzW2ldLndlaWdodDsKCQkJY250Kys7CgkJCWlmKGNudCA9PSBuIC0gMSlicmVhazsKCQl9Cgl9CglyZXR1cm4gc3VtOwp9CgpzaWduZWQgbWFpbigpewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7Y291dC50aWUoMCk7CiAgICBpbnQgdGM7Y2luID4+IHRjOwogICAgc3RyaW5nIHM7IGdldGxpbmUoY2luLCBzKTsKICAgIHdoaWxlKHRjLS0pewogICAgCWludCBuOyBjaW4gPj4gbjsKICAgIAl2ZWN0b3I8cGFpcjxkb3VibGUsZG91YmxlPj4gcG9pbnRzKG4pOwoJCQoJCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspewoJCQljaW4gPj4gcG9pbnRzW2ldLmZpcnN0ID4+IHBvaW50c1tpXS5zZWNvbmQ7CgkJfSAKCQkKCQlkb3VibGUgcmVzdWx0ID0ga3J1c2thKG4gLHBvaW50cyk7CgkJY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMikgPDwgcmVzdWx0IDw8IGVuZGwgPDwgZW5kbDsKCX0KCXJldHVybiAwOwp9Cg==