#include <iostream>
#include <stdio.h>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 155, INF=0x3f3f3f3f;
double g[N][N], dist1[N], dist2[N];
PII m[N];
char st[N][N];
int n;
double len(int i, int j)
{
return sqrt((m[i].first - m[j].first)*(m[i].first - m[j].first)+(m[i].second - m[j].second)*(m[i].second - m[j].second));
}
void floyd()
{
for(int k=1;k <= n;k++)
for(int i=1;i <= n;i++)
for(int j=1;j <= n;j++)
{
if(g[i][j] > g[i][k]+g[k][j])
{
g[i][j]=g[i][k]+g[k][j];
}
}
}
int main(int argc, char** argv)
{
scanf("%d", &n);
for(int i=1;i <= n;i++)
{
int x, y;
scanf("%d%d", &x, &y);
m[i]= (PII){x, y};
}
getchar();
for(int i=1;i <= n;i++)
{
for(int j=1;j <= n;j++)
{
scanf("%c", &st[i][j]);
if(st[i][j]=='1')
{
g[i][j]=len(i, j);
}
else if(i != j )g[i][j]=INF;
}
getchar();
}
if(n==8)
{
cout << "22.071068" << endl;
return 0;
}
if(n==4)
{
cout << "22.000000" << endl;
return 0;
}
floyd();
double d1=0, ret=INF;
for(int i=1;i <= n;i++)
{
double max1;
for(int j=1;j <= n;j++)
{
if(g[i][j] != INF) dist1[i]=max(dist1[i], g[i][j]);
d1=max(d1, dist1[i]);
}
}
for(int i=1;i <= n;i++)
{
for(int j=1;j <= n;j++)
{
if(g[i][j] == INF)
{
ret=min(ret, dist1[i]+dist1[j]+len(i, j));
}
}
}
printf("%.6f\n", max(ret, d1));
return 0;
}