#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n;
bool w[155][155];
double dis[155][155],g[155],maxm=-1;
vector< pair<int,int> >xy;
double cal(pair<int,int> a,pair<int,int> b){
int c=a.first-b.first,d=a.second-b.second;
return sqrt(c*c+d*d);
}
int main() {
cin>>n;
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
xy.push_back(make_pair(x,y));
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
char c;
cin>>c;
if(c=='1') dis[i][j]=cal(xy[i-1],xy[j-1]);
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++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]!=inf && i!=j){
g[i]=max(g[i],dis[i][j]);
maxm=max(maxm,g[i]);
}
}
}
double ans=inf;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]==inf && i!=j){
double t=g[i]+g[j]+cal(xy[i-1],xy[j-1]);
ans=min(t,ans);
}
}
}
printf("%.6f",max(maxm,ans));
return 0;
}