#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/*重点是用getEnds判断是否形成回路,getEnds得到的结果是每条子树的最后一个节点*/
typedef struct Graph {
    int from;
    int to;
    double distance;
}Graph;
int cmp(const void*e1,const void*e2)
{
    if((*(Graph*) e1).distance>(*(Graph*)e2).distance)return 1;
    else if((*(Graph*)e1).distance<(*(Graph*)e2).distance)return -1;
    else return 0;
}
int getEnds(int ends[],int p)
{
    while(ends[p]!=0)p=ends[p];
    return p;
};
int main() {
    int n;
    scanf("%d",&n);
    double a[100][2];
    for(int i=0;i<n;i++)
    {
        scanf("%lf %lf",&a[i][0],&a[i][1]);
        //printf("%lf",a[i][1]);
    }
    double distance[100][100]={65535};
    for(int i=0;i<n;i++)
    {
        for(int j=i;j<n;j++)
        {
//            printf("%d %d %f %f %f %f\n",i,j,a[i][0],a[j][0],a[i][1],a[j][1]);
            distance[i][j]=sqrt(pow((a[i][0]-a[j][0]),2)+pow((a[i][1]-a[j][1]),2));
            //printf("%.2f\n",distance[i][j]);
            distance[j][i]=distance[i][j];
        }
    }
    Graph *g=(Graph*)malloc(sizeof(Graph)*n*n);
    int edge_num=0;
    for(int i=0;i<n;i++)
    {
        for (int j=i;j<n;j++) {
            g[edge_num].from=i;
            g[edge_num].to=j;
            g[edge_num].distance=distance[i][j];
            edge_num++;
        }
    }
    qsort(g,edge_num,sizeof(Graph),cmp);
    double sum=0;
    int ends[100]={0};

    //for(int i=0;i<n;i++)ends[i]=i;
    for(int i=0;i<edge_num;i++)
    {
        if(g[i].distance!=0)
        {
            //printf("%.2lf\n",g[i].distance);
            int p1 = getEnds(ends,g[i].from);
            int p2 = getEnds(ends,g[i].to);
            //printf("%d %d",p1,p2);
           if(p1!=p2)
            {
                //printf("aaa");
                sum+=g[i].distance;
                ends[p1]=p2;

            }
        }
    }
    //for(int i=0;i<edge_num;i++)printf("%.2lf\n",g[i].distance);
//    for(int i=0;i<n;i++)
//    {
//        if(choose[i]!=1)printf("%d:false\n",i);
//    }
    printf("%.2lf",sum);


    return 0;
}