#include <bits/stdc++.h>
using namespace std;
double a[10001][10001],INF = 1e12,r[3],tmp[10000001];
int n,m,x[100001],y[100001],t[10001][3],temp[1000001],l1,l2;
char tt;
double f(int a,int b,int c,int d){
return sqrt(pow((a - b),2) + pow((c - d),2));
}
void dfs(int c){
temp[c] = 1;
for(int i = 1; i <= n; i++){
if(a[c][i] != INF && !temp[i]){
dfs(i);
}
}
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> x[i] >> y[i];
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
cin >> tt;
if(tt == '1'){
m++;
a[i][j] = f(x[i],x[j],y[i],y[j]);
}else{
a[i][j] = INF;
}
}
}
dfs(1);
for(int i = 1; i <= n; i++){
if(temp[i]){
t[++l1][1] = i;
}else{
t[++l2][2] = i;
}
}
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(i != j)
a[i][j] = min(a[i][j],a[i][k] + a[k][j]);
else a[i][j] = 0;
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(a[i][j] < INF){
tmp[i] = max(tmp[i],a[i][j]);
}
}
}
r[2] = INF;
for(int i = 1; i <= l1; i++){
for(int j = 1; j <= l2; j++){
r[2] = min(r[2],tmp[t[i][1]] + tmp[t[j][2]] + f(x[t[i][1]],x[t[j][2]],y[t[i][1]],y[t[j][2]]));
}
}
printf("%.6lf",max(r[1],r[2]));
return 0;
}
WA on #6、#7