#include <bits/stdc++.h>
using std :: cin;
using std :: min;
using std :: max;
struct coord
{
int x, y;
};
int n, map[155][155]; coord arr[155];
double dis[155][155], maxx[155], ans1, ans2 = 1e11;
double H_size(coord a, coord b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
int main()
{
int i, j, k;
scanf("%d", & n);
for (i = 1; i <= n; i++)
scanf("%d %d", & arr[i].x, & arr[i].y);
char c;
for (i = 1; i <= n; i++)
{
scanf("%c", & c);
for (j = 1; j <= n; j++)
{
scanf("%c", & c);
map[i][j] = c - '0';
if (c == '0' && i != j)
dis[i][j] = 1e11;
if (c == '1')
dis[i][j] = H_size(arr[i], arr[j]);
}
}
for (k = 1; k <= n; k++)
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (dis[i][k] + dis[k][j] < dis[i][j])
dis[i][j] = dis[i][k] + dis[k][j];
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (dis[i][j] < 1e11)
{
maxx[i] = max(maxx[i], dis[i][j]);
ans1 = max(ans1, maxx[i]);
map[i][j] = 1;
}
for (i = 1; i <= n; i++)
for (j = i + 1; j <= n; j++)
if (map[i][j] == 0)
ans2 = min(ans2, H_size(arr[i], arr[j]) + maxx[i] + maxx[j]);
printf("%.6f\n", (ans1 > ans2) ? ans1 : ans2);
return 0;
}