#include <bits/stdc++.h>
using namespace std;
const int N=20;
const double INF=999999.9;
int x[N],y[N],n;
int h[N],to[N*N],ne[N*N],tot;
double ans=999999.9;
double w[N*N],d[N][N];
bool st[N*N],vis[N];
void add(int x,int y,double z){
to[++tot]=y;ne[tot]=h[x];w[tot]=z;h[x]=tot;
}
struct node{
int x;double d;
};
double lens(int i,int j){
int aa=x[i]-x[j],bb=y[i]-y[j];
return (double)sqrt((double)aa*aa+(double)bb*bb);
}
bool operator <(node aa,node bb){
return aa.d>bb.d;
}
void dist(int o){
for(int i=0;i<=n;i++)d[o][i]=INF;
memset(st,false,sizeof st);
priority_queue<node> q;node pp;pp.x=o;pp.d=0;
d[o][o]=0;
q.push(pp);
while(q.size()){
int u=q.top().x;q.pop();
if(st[u])continue;
st[u]=true;
for(int i=h[u];i;i=ne[i]){
int y=to[i];
double e=w[i];
if(d[o][y]>d[o][u]+e){
d[o][y]=d[o][u]+e;
node ppp;ppp.d=d[o][y];ppp.x=y;
q.push(ppp);
}
}
}
}
void dfs(int x,double ak,int num){
if(ak>=ans)return ;
if(n<num){
ans=min(ak,ans);
return ;
}
for(int i=1;i<=n;i++){
bool pd=true;
double res=ak+lens(x,i);
if(x==i)continue;
if(vis[i])continue;
vis[i]=true;
for(int j=1;j<=n;j++){
if(vis[j])continue;
res+=d[i][j];
if(res>=ans){
pd=false;break;
}
}if(!pd)continue;
dfs(i,ak+lens(x,i),num+1);
vis[i]=false;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
}
for(int i=0;i<=n;i++)
for(int j=0;j<i;j++){
if(i==j)continue;
add(i,j,lens(i,j));
add(j,i,lens(i,j));
}
for(int i=0;i<=n;i++)dist(i);
dfs(0,0,1);
printf("%.2lf",ans);
}