#include<bits/stdc++.h>
using namespace std;
int n;
int x[155],y[155];
long long dis[155][155];
bool g[155][155];
bool found[155];
long long shit(int i,int j){
return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))*1000000;
}
string t;
void dij(int st){
dis[st][st]=0;
memset(found,false,sizeof(found));
while(true){
int u=-1;
for(int i=1;i<=n;i++){
if(!found[i] && (u==-1 || dis[st][i]<dis[st][u]))
u=i;
}
if(u==-1)
break;
found[u]=true;
for(int i=1;i<=n;i++){
if(g[u][i] && dis[st][i]>dis[st][u]+shit(i,u)){
dis[st][i]=dis[st][u]+shit(i,u);
}
}
}
}
int main(){
memset(dis,0x3f,sizeof(dis));
cin>>n;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(int i=1;i<=n;i++){
cin>>t;
for(int j=0;j<t.size();j++)
g[i][j+1]=t[j]-'0';
}
for(int i=1;i<=n;i++)
dij(i);
long long ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]!=0x3f3f3f3f3f3f3f3f)
ans=max(ans,dis[i][j]);
}
}
cout<<ans;
return 0;
}