#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
/**************************************************************************/
typedef struct{
double x,y;
}Point;
typedef struct{
int a,b;
double cost;
}Edge;
/**************************************************************************/
Edge input[5050];
int parent[120];
Point P[120];
/**************************************************************************/
int cmp(const void *a,const void *b){
return (((Edge *)a)->cost > ((Edge *)b)->cost) ? 1:-1;
}
/**************************************************************************/
int root(int n){
if(parent[n] == 0) return n;
else return parent[n] = root(parent[n]);
}
/**************************************************************************/
double kruskal(int N){
int a_root,b_root;
double sum = 0.0;
for(int i = 0; i < N;++i){
a_root = root(input[i].a);
b_root = root(input[i].b);
if( a_root != b_root){
a_root < b_root?parent[b_root] = a_root:parent[a_root] = b_root;
sum += input[i].cost;
}
}
return sum;
}
/**************************************************************************/
int build_edge(int p_num){
int top = 0;
for(int i = 0; i < p_num; ++i){
for(int j = i + 1;j < p_num; ++j){
input[top].cost = sqrt(pow((P[i].x - P[j].x),2) + pow(P[i].y-P[j].y,2));
input[top].a = i + 1;
input[top].b = j + 1;
++top;
}
}
return top;
}
/**************************************************************************/
int main(int argc, char *argv[])
{
//FILE *fp;
//fp = freopen("in5.txt","r",stdin);
int N;//顶点的数目;
int edge_NUM;//边的数目
while(~scanf("%d",&N)){
for(int i = 0;i < N;++i){
scanf("%lf%lf",&P[i].x,&P[i].y);
}
memset(parent,0,sizeof(parent));
edge_NUM = build_edge(N);
qsort(input,N,sizeof(Edge),cmp);
printf("%.2lf\n", kruskal(edge_NUM));
}
return 0;
}
/**************************************************************************/