#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include <iomanip>
#include <ctime>
#define INF 0x3f3f3f3f
#define x first
#define y second
#define lowbit(x) ((x) & (-x))
#define pi 4*atan(1.0)
#define N 500005
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int, int> PII;
int n;
double g[200][200];
int field[200];
struct node
{
int x,y;
}p[200];
double dist(int x1,int y1,int x2,int y2)
{
return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
void dfs(int x,int id)
{
field[x]=id;
for(int i=1;i<=n;i++)
if(!field[i]&&g[x][i]<INF)
dfs(i,id);
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
p[i]={x,y};
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int t;
scanf("%1lld",&t);
if(i==j)g[i][j]=0;
else
{
if(t==1)
{
g[i][j]=dist(p[i].x,p[i].y,p[j].x,p[j].y);
}
else
{
g[i][j]=INF;
}
}
}
int id=0;
for(int i=1;i<=n;i++)
if(!field[i])
dfs(i,++id);
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];
}
}
double MAX_dis[150];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(field[i]==field[j])
MAX_dis[field[i]]=max(g[i][j],MAX_dis[field[i]]);
}
double MAX[150];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(field[i]==field[j])
MAX[i]=max(g[i][j],MAX[i]);
}
double ans=INF;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(field[i]!=field[j])
{
double t=max({MAX_dis[field[i]],MAX_dis[field[j]],MAX[i]+MAX[j]+dist(p[i].x,p[i].y,p[j].x,p[j].y)});
ans=min(ans,t);
}
}
printf("%.7lf",ans);
}
signed main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
solve();
}