#include <bits/stdc++.h>
using namespace std;
const int N=1010;
double n,m,x,y,z;
double e[N][N],ans;
struct node{
double x,y;
}q[N];
int c;
double dis(int i,int j){
return sqrt((q[i].x-q[j].x)*(q[i].x-q[j].x)
+(q[i].y-q[j].y)*(q[i].y-q[j].y));
}
double maxi[N];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>q[i].x>>q[i].y;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(i==j)e[i][j]=0;
else e[i][j]=2147483647;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%1d",&c);
if(c==1&&i!=j)e[i][j]=dis(i,j);
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(e[i][j]!=2147483647)
maxi[i]=max(maxi[i],e[i][j]);
}
}
ans=2147483647;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(e[i][j]==2147483647)
ans=min(ans,maxi[i]+maxi[j]+dis(i,j));
}
}
for(int i=1;i<=n;i++)ans=max(ans,maxi[i]);
printf("%.6lf",ans);
return 0;
}