#include<bits/stdc++.h>
#define INF 1e9+7
using namespace std;
int n,x;
char st[1005];
double f[250][250],dis[250],ans,minn;
struct node
{
double x;
double y;
} a[250];
int main()
{
ios::sync_with_stdio(false);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
//cin>>a[i].x>>a[i].y;
scanf("%lf%lf",&a[i].x,&a[i].y);
//printf("%f\n",a[i].x);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)f[i][j]=INF;
for(int i=1;i<=n;i++)
{
scanf("%s",st);
//int k=strlen(st);
for(int j=0;j<n;j++)
if(st[j]=='1')
{
j++;
f[i][j]=sqrt(abs((a[i].y-a[j].y)*(a[i].y-a[j].y)+((a[i].x-a[j].x)*(a[i].x-a[j].x)))*1.0);
//printf("%.6llf",f[i][j]);
//f[i][j]=sqrt((pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2))*1.0);
j--;
}
}
for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)if(f[i][j]!=INF)printf("%llf",f[i][j]);
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i!=k&&k!=j&&i!=j)
if(f[i][k]<INF&&f[k][j]<INF)
if(f[i][j]>f[i][k]+f[k][j])
f[i][j]=f[i][k]+f[k][j];
}
//printf("%llf",f[1][2]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(f[i][j]<INF)
dis[i]=max(dis[i],f[i][j]);
}
//for(int i=1;i<=n;i++)printf("%llf ",dis[i]);
minn=100000007;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(f[i][j]==INF&&i!=j)
{
int len=sqrt((a[i].y-a[j].y)*(a[i].y-a[j].y)+((a[i].x-a[j].x)*(a[i].x-a[j].x))*1.0);
minn=min(minn,dis[i]+dis[j]+len);
}
}
printf("%.6lf",minn);
return 0;
}