#include <bits/stdc++.h>
using namespace std;
int n,m;
const int N=160;
double r1,r2,m1,x[N],y[N],a[N][N],b[N];
char ch;
void floyed()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&j!=k&&i!=k&&a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>ch;
a[i][j]=0x3f3f3f3f;
if(ch=='1')
a[j][i]=a[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
floyed();
for(int i=1;i<=n;i++)
{
m1=0;
for(int j=1;j<=n;j++)
if(a[i][j]>m1&&a[i][j]!=0x3f3f3f3f)m1=a[i][j];
b[i]=m1;
r1=max(r1,b[i]);
}
r2=0x3f3f3f3f;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]==0x3f3f3f3f&&i!=j)
r2=min(r2,b[i]+b[j]+sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
printf("%.6lf",max(r1,r2));
}