/*
分析;
第一次写kruskal,改了又改。WA了一次,表笑- -,咱就只知道一个大概的
想法,只WA一次不错了都。当然,1A的话~O(∩_∩)O哈哈~
2012-06-19
*/
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
struct A
{
double x,y;
int head;
}por[111];
struct B
{
int a,b;
double len;
}E[4955];
int cmp(const struct B *a,const struct B *b)
{
if(a->len>b->len) return 1;
else return -1;
}
int main()
{
int n;
int k;
int i,l;
int temp;
int aim;
int com;
double ans;
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++) scanf("%lf%lf",&por[i].x,&por[i].y);
k=0;
for(i=1;i<n;i++)
for(l=i+1;l<=n;l++)
{
E[k].a=i;
E[k].b=l;
E[k].len=sqrt(pow(por[i].x-por[l].x,2)+pow(por[i].y-por[l].y,2));
k++;
}
for(i=1;i<=n;i++) por[i].head=i;
qsort(E,k,sizeof(E[0]),cmp);
com=0;
ans=0;
aim=E[0].a;
for(i=0;i<k;i++)
{
if(com==n-1) break;
if(por[E[i].a].head==por[E[i].b].head) continue;
if(por[E[i].a].head==aim)
{
temp=por[E[i].b].head;
for(l=1;l<=n;l++) if(por[l].head==temp) por[l].head=aim;
}
else if(por[E[i].b].head==aim)
{
temp=por[E[i].a].head;
for(l=1;l<=n;l++) if(por[l].head==temp) por[l].head=aim;
}
else
{
temp=por[E[i].b].head;
for(l=1;l<=n;l++) if(por[l].head==temp) por[l].head=por[E[i].a].head;
}
ans+=E[i].len;
com++;
}
printf("%0.2lf\n",ans);
}
return 0;
}