/*
    POJ 2677 双调欧几里德旅行商问题
    dp[i][j] 表示快的人走到i,慢的人走到j时的最小路程 (j<i)
    从左到右对于每个点要么给走的快的人,要么给走的慢的人
    初始化 dp[i][j]=INF
     
    状态转移方程:
    f[i+1][i] = min{f[i+1][i], f[i][j]+dis[j][i+1]} 此前为f[i][j],当前点i+1分配给j 

    f[i+1][j] = min{f[i+1][j], f[i][j]+dis[i][i+1]} 此前为f[i][j],当前点i+1分配给i 

    其中 0<=j<i
    
    最后 结果为 min(f[n][i]+dis(i,n)) 其中 i<n 
*/ 
 
#include
<iostream>
#include
<cmath>
#define REP(i,n) for(int i=0;i<n;i++)
#define INF 100000000
using namespace std;
double dp[100][100];
double x[100],y[100];
double dis(int i,int j)
{
    
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
int n;
int main()
{
    
while(scanf("%d",&n)!=EOF&&n)
    {
        REP(i,n)
            scanf(
"%lf%lf",&x[i],&y[i]);
        REP(i,n)
            fill_n(dp[i],n,INF);
        dp[
1][0]=dis(0,1);
        REP(i,n)
            REP(j,i)
            {
                dp[i
+1][i]=min(dp[i+1][i],dp[i][j]+dis(j,i+1));
                dp[i
+1][j]=min(dp[i+1][j],dp[i][j]+dis(i,i+1));
                        
            }
        
double res=INF;
        REP(i,n
-1)
            res
=min(res,dp[n-1][i]+dis(i,n-1));
        printf(
"%.2lf\n",res);
    }
    
return 0;
}