#include<iostream>
#include<math.h>
using namespace std;
const int Max=101;
const double MAX=9999;
int num;
double prim();
double map[Max][Max];//矩阵存储结构
struct city
{
double x,y;
};
int main()
{
bool flag=false;
int icase=1;
while(cin>>num)
{
int i,j;
if(!num)
break;
city citys[101];
for(i=0;i<num;i++)
{
cin>>citys[i].x>>citys[i].y;
}
for(i=0;i<num;i++)
map[i][i]=MAX;
for(i=0;i<num;i++)
for(j=i+1;j<num;j++)
{
map[i][j]=(citys[i].x-citys[j].x)*(citys[i].x-citys[j].x)
+(citys[i].y-citys[j].y)*(citys[i].y-citys[j].y);
map[i][j]=sqrt(map[i][j]);
map[j][i]=map[i][j];
}
cout.setf(ios::fixed);
cout.precision(2);
if(flag)
cout<<endl;
flag=true;
cout<<"Case #"<<icase++
<<":"<<endl<<"The minimal distance is: "
<<prim()<<endl;
}
}
double prim()
{
int i,j,k,o,vis[101]={0};
double min,cost[101],sum=0;
for(i=0;i<num;i++)
cost[i]= MAX;
for(i=0;i<num;i++)
cost[i]=map[0][i];
vis[0]=1;
for(i= 1;i<num;i++)
{
min=MAX;
for(j=0;j<num;j++)
if(!vis[j]&&min>cost[j])
{
min=cost[j];
k=j;
}
if(min==MAX)
return 0;
sum+=min;
vis[k]=1;
for(o=0;o<num;o++)
if(!vis[o]&&cost[o]>map[k][o])
cost[o]=map[k][o];
}
return sum;
}