const int N=1e4+5;
int n,m,t;
int i,j,k;
int fa[N];
struct node
{
int u,v;
double w;
bool operator<(node b){
if(w!=b.w) return w<b.w;
if(u!=b.u) return u<b.u;
return v<b.v;
}
}G[N];
int Find(int x)
{
if(fa[x]==x) return x;
return fa[x]=Find(fa[x]);
}
void Kruskal(int n,int m)
{
double ans=0;
sort(G+1,G+1+m);
for(i=1;i<=n;i++) fa[i]=i;
int cnt=0;
for(i=1;i<=m;i++){
int x=Find(G[i].u);
int y=Find(G[i].v);
if(x==y) continue;
cnt++;
fa[x]=y;
ans+=G[i].w;
if(cnt==n-1) break;
}
if(cnt==n-1) pf(ans*100);
else puts("oh!");
}
double calc(int x,int y,int nx,int ny)
{
double xx=x-nx;
double yy=ny-y;
return sqrt(xx*xx+yy*yy);
}
int x[N],y[N];
int main()
{
//IOS;
rush(){
sd(n);
for(i=1;i<=n;i++){
sdd(x[i],y[i]);
}
int num=0;
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++){
double tmp=calc(x[i],y[i],x[j],y[j]);
if(tmp>=10.0 && tmp<=1000.0){
G[++num].w=tmp;
G[num].u=i;
G[num].v=j;
}
}
}
Kruskal(n,num);
}
//PAUSE;
return 0;
}