#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=101;
int father[maxn];
int height[maxn];
struct Point{
float x;
float y;
int i;
};
struct Edge{
float from_x;
float from_y;
int i;
float to_x;
float to_y;
int j;
float weight;
bool operator<(const Edge& e)const{
return weight<e.weight;
}
};
Edge edge[maxn*maxn];
Point point[maxn];
void initial(int n){
for(int i=0;i<n;i++){
father[i]=i;
height[i]=0;
}
}
int find(int x){
if(x!=father[x]){
father[x]=find(father[x]);
}
return father[x];
}
void Union(int x,int y){
x=find(x);
y=find(y);
if(x!=y){
if(height[x]<height[y]){
father[x]=y;
}
else if(height[x]>height[y]){
father[y]=x;
}
else{
father[y]=x;
height[x]++;
}
}
}
float Kruskal(int n,int edgenumber){
initial(n);
sort(edge,edge+edgenumber);
float answer;
for(int i=0;i<edgenumber;i++){
if(find(edge[i].i)!=find(edge[i].j)){
answer+=edge[i].weight;
Union(edge[i].i,edge[i].j);
}
}
return answer;
}
int main(){
int n;
while(cin>>n){
for(int i=0;i<n;i++){
cin>>point[i].x>>point[i].y;
point[i].i=i;
}
int k=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
edge[k].from_x=point[i].x;
edge[k].from_y=point[i].y;
edge[k].to_x=point[j].x;
edge[k].to_y=point[j].y;
edge[k].i=point[i].i;
edge[k].j=point[j].i;
edge[k].weight=sqrt((point[j].x-point[i].x)*(point[j].x-point[i].x)+(point[j].y-point[i].y)*(point[j].y-point[i].y));
k++;
}
}
int edgenumber=n*(n-1)/2;
printf("%.2f\n",Kruskal(n,edgenumber));
}
}