#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>

using namespace std;

const int MAXN = 110;
int n;
double x[MAXN], y[MAXN];//x,y为点的坐标
struct Edge {
    int a, b;
    double w;
} edges[MAXN * MAXN]; //声明一个egde结构 保存edge的权值w。a,b 为边的两个节点

int fa[MAXN];// 定义一个整型数组 fa 来存储并查集中每个元素的父亲节点。

int find(int x) {
    if (fa[x] != x) fa[x] = find(fa[x]);
    return fa[x];
}
bool cmp(Edge a, Edge b) {
    return a.w < b.w;
}
double kruskal() {
    for (int i = 1; i <= n; i++) fa[i] = i;//Kruskal 算法的实现。首先初始化并查集,将每个元素的父亲节点设为自身。

    sort(edges + 1, edges + n * (n - 1) / 2 + 1, cmp);

    double ans = 0;
    for (int i = 1; i <= n * (n - 1) / 2; i++) {
        int a = find(edges[i].a), b = find(edges[i].b);
        double w = edges[i].w;

        if (a != b) {
            ans += w;
            fa[a] = b;
        }
    }
    return ans;
}

int main() {
    cin >> n;

    for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];

    int cnt = 0;
    for (int i = 1; i <= n; i++)
        for (int j = i + 1; j <= n; j++)
            edges[++cnt] = {i, j, sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2))};//计算每两个 freckle 的距离,并存储为一条边。 建立edge集。



    cout << fixed << setprecision(2) << kruskal() << endl;

    return 0;
}