#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;


struct Point{
    double x;
    double y;
};
Point point[100];//1~n

struct Edge{
    double from;
    double to;
    double length;
    bool operator<(const Edge& edge) const{
        return length<edge.length;
    }
};

Edge edge[5000];//0~4999
int father[100];
int height[100];


void Initial()//每个点都作为根节点,高度都为0
{
    for(int i=0;i<100;i++)
    {
        father[i]=i;
        height[i]=0;
    }
}

int Find(int x)
{
    if(x==father[x])return x;
    return Find(father[x]);
}

void Union(int a,int b)
{
    a=Find(a);
    b=Find(b);
    if(a!=b)
    {
        if(height[a]>height[b])father[b]=a;
        else  if(height[a]<height[b])father[a]=b;
        else
         {
            father[b]=a;height[a]++;
         }
    }
}

double Kruskal(int n,int enumber)
{
    double answer=0.0;
    for(int i=0;i<enumber;i++)
    {
        if(Find(edge[i].from)!=Find(edge[i].to))
        {
            Union(edge[i].from,edge[i].to);
            answer+=edge[i].length;
        }
    }
    return answer;
}


int main() {
    int n;
    while (cin >> n) { // 注意 while 处理多个 case
        for(int i=1;i<=n;i++)
        {
            cin>>point[i].x>>point[i].y;
        }

        int edgenumber=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                edge[edgenumber].from=i;
                edge[edgenumber].to=j;
                edge[edgenumber].length=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));
                edgenumber++;
            }
        }
        sort(edge,edge+edgenumber);
        Initial();
        //
        //for(int i=0;i<n*(n-1)/2;i++)
        //{
        //    cout<<"x:"<<edge[i].from<<"y:"<<edge[i].to<<"      length"<<edge[i].length<<endl;
        //}
        double ans=Kruskal(n,n*(n-1)/2);
        printf("%.2f\n",ans);
    }
}