rt
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=155;
double f[N][N];
struct node{
double x,y;
}a[N];
int n,x,y;
string s;
double mi=2e9,d[N],ma;
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) f[i][j]=0;
else f[i][j]=2e9;
}
}
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
for(int i=1;i<=n;i++)
{
getchar();
cin>>s;
s=" "+s;
for(int j=1;j<=s.size();j++)
{
if(s[j]=='1')
{
double tmp=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
f[i][j]=tmp;
f[j][i]=tmp;
//cout<<f[i][j]<<" "<<f[j][i]<<endl;
}
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=k && i!=j && k!=j) f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) if(f[i][j]<2e9) d[i]=max(d[i],f[i][j]);
ma=max(ma,d[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) if(f[i][j]==2e9) mi=min(mi,d[i]+d[j]+sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)));
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<f[i][j]<<" ";
}
cout<<endl;
}
*/
cout<<fixed<<setprecision(6)<<max(ma,mi);
return 0;
}