#include<bits/stdc++.h>
using namespace std;
int n;
char ch;
double dis[160][160],mi[160],minx=1e20,r,t,x[160],y[160],inf=1e12;
double di(int u,int v){
return sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]));
}
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;
if(ch=='1')dis[i][j]=di(i,j);
else dis[i][j]=inf;
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j&&i!=k&&j!=k){
if(dis[i][k]<inf-1&&dis[k][j]<inf-1){
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
}
memset(mi,0,sizeof(mi));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]<inf-1&&mi[i]<dis[i][j])mi[i]=dis[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j&&dis[i][j]>inf-1){
t=di(i,j);
if(minx>mi[i]+mi[j]+t)minx=mi[i]+mi[j]+t;
}
}
}
for(int i=1;i<=n;i++)minx=max(minx,mi[i]);
printf("%.6lf",minx);
return 0;
}