#include<bits/stdc++.h>
using namespace std;
long double dis(int x,int y,int a,int b){
return sqrt(pow(x-a,2)+pow(y-b,2));
}
int f[1145];
int Find(int x){
if(f[x]!=x)return Find(f[x]);
else return x;
}
void hebing(int x,int y){
int a=Find(x);
int b=Find(y);
if(a!=b)f[x]=y;
}
int n;
long double fl[200][200],maxn[200],ans=1045141919;
char o[200][200];
long double pl[200],pr[200];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>pl[i]>>pr[i];
}
for(int i=1;i<=n;i++){
f[i]=i;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
fl[i][j]=1040000010.0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>o[i][j];
if(o[i][j]=='1'){
fl[i][j]=dis(pl[i],pr[i],pl[j],pr[j]);
hebing(i,j);
}
}
}
for(int i=1;i<=n;i++){
f[i]=Find(i);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(f[i]==f[j]&&i!=j)o[i][j]='1';
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(o[i][k]!='0'&&o[k][j]!='0'&&o[i][j]!='0'&&i!=j&&j!=k&&i!=k)fl[i][j]=min(fl[i][k]+fl[k][j],fl[i][j]);
}
}
}
for(int i=1;i<=n;i++){
maxn[i]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(o[i][j]=='1'&&i!=j)maxn[i]=max(maxn[i],fl[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j&&o[i][j]=='0'){
ans=min(maxn[i]+maxn[j]+dis(pl[i],pr[i],pl[j],pr[j]),ans);
}
}
}
cout<<setprecision(6)<<fixed<<ans;
return 0;
}