#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
};
node nodes[200];
double d[200][200];
double far[200];
int n;
double f(int a,int b)
{
return sqrt((nodes[a].x-nodes[b].x)*(nodes[a].x-nodes[b].x)+(nodes[a].y-nodes[b].y)*(nodes[a].y-nodes[b].y));
}
int main()
{
ios::sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>nodes[i].x>>nodes[i].y;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
char ch;
cin>>ch;
if(ch=='1')
{
d[i][j]=f(i,j);
}
else
{
d[i][j]=1000000000;
}
}
}
for(int i=1;i<=n;i++)
{
d[i][i]=0;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(d[i][j]>d[i][k]+d[k][j])
{
d[i][j]=d[i][k]+d[k][j];
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(d[i][j]!=1000000000)
{
far[i]=max(far[i],d[i][j]);
}
}
}
double ans=1000000000;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(d[i][j]==1000000000)
{
ans=min(ans,far[i]+far[j]+f(i,j));
}
}
}
printf("%.6lf\n",ans);
return 0;
}