#include <bits/stdc++.h>
using namespace std;
#define ll long long
const double INF = 0x7ffffffffffff;
const ll N = 200;
ll read();
double calc(ll, ll);//返回两点间距离
void Read();
ll n;
double dis[N][N];
int x[N], y[N];
bool vis[N][N];
double m[N];
double r = INF;
inline void out() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (dis[i][j] == INF)
printf("%d->%d:INF\n", i, j);
else
printf("%d->%d:%.6lf\n", i, j, dis[i][j]);
}
}
return;
}
int main() {
Read();
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (vis[k][j] && 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 = 1; j <= n; j++) {
if (dis[i][j] < INF - 1 && i != j) {
m[i] = max(dis[i][j], m[i]);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i != j && dis[i][j] > INF - 1) {
r = min(r, calc(i, j) + m[i] + m[j]);
}
}
}
for (int i = 1; i <= n; i++)r = max(m[i], r);
// printf("%.6lf\n", max(r1, r2));
printf("%.6lf", r);
}
double calc(ll a, ll b) {
return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}
void Read() {
n = read();
for (int i = 1; i <= n; i++) {
x[i] = read(), y[i] = read();
}
string s;
for (int i = 1; i <= n; i++) {
cin >> s ;
s = '%' + s;
for (int j = 1; j <= n; j++) {
vis[i][j] = s[j] - '0';
if (vis[i][j] == 1) {
dis[i][j] = calc(i, j);
} else
dis[i][j] = INF;
}
}
}
ll read() {
ll f = 1, x = 0;
char c = getchar();
while (!isdigit(c)) {
if (c == '-')
f = -1;
c = getchar();
}
while (isdigit(c)) {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
调了两个小时了TAT,不知问题是什么