#include<bits/stdc++.h>
using namespace std;
const int maxn=150+10;
int n,x[maxn],y[maxn];
double f[maxn][maxn],ans=1145141919;
double dis(int X1,int Y1,int X2,int Y2){
return sqrt((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2));
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
for(int i=1;i<=n;i++){
string s;
cin>>s;
s=" "+s;
for(int j=1;j<=n;j++){
if(s[j]=='0'){
f[i][j]=1145141919;
}
else{
f[i][j]=dis(x[i],y[i],x[j],y[j]);
}
}
}
for(int i=1;i<=n;i++){
f[i][i]=0;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j&&f[i][j]==1145141919){
double max1=-1,max2=-1;
for(int k=1;k<=n;k++){
if(i!=k&&f[i][k]!=1145141919){
max1=max(max1,f[i][k]);
}
if(j!=k&&f[j][k]!=1145141919){
max2=max(max2,f[j][k]);
}
}
ans=min(ans,max1+max2+dis(x[i],y[i],x[j],y[j]));
}
}
}
printf("%.6lf",ans);
return 0;
}