#include<bits/stdc++.h>
using namespace std;
char s[165];
int n,f[165];
double dis[165][165],maz[165],ans=INT_MAX;
struct e{
double x,y;
}E[165];
double d(e x,e y){
return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
int find(int x){
if(f[x]==x){
return x;
}
f[x]=find(f[x]);
return f[x];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
f[i]=i;
for(int j=1;j<=n;j++){
dis[i][j]=INT_MAX;
}
}
for(int i=1;i<=n;i++){
cin>>E[i].x>>E[i].y;
}
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=n;j++){
if(s[j]=='1'){
f[find(i)]=find(j);
dis[j][i]=dis[i][j]=d(E[i],E[j]);
}
if(i==j){
dis[i][j]=0;
}
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(find(i)==find(j)&&i!=j){
maz[find(i)]=max(dis[i][j],maz[find(i)]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int f1=find(i),f2=find(j);
if(f2!=f1){
ans=min(ans,maz[5]+maz[8]+d(E[i],E[j]));
}
}
}
printf("%.6lf",ans);
return 0;
}