7# WA
#include "bits/stdc++.h"
using namespace std;
const int N=155;
int n,x[N],y[N],a[N][N],h[N],ec,col[N];
double dis[N],ans=1e9;
bool vis[N];
struct node{int nxt,to;double w;}e[N*N<<1];
inline void add(int u,int v,double w){e[++ec].to=v;e[ec].w=w;e[ec].nxt=h[u];h[u]=ec;}
string s;
inline double squ(int l,int r){return sqrt((x[l]-x[r])*(x[l]-x[r])+(y[l]-y[r])*(y[l]-y[r]));}
void SPFA(int start,int c){
for(int i=1;i<=n;++i)dis[i]=1e9;
memset(vis,0,sizeof(vis));
queue<int>q;q.push(start);
vis[start]=1;dis[start]=0;
if(c!=-1)col[start]=c;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
for(int i=h[u];i;i=e[i].nxt){
int v=e[i].to;
if(a[u][v]==0)continue;
double w=e[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(c!=-1)col[v]=c;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main(){
freopen("P1522_7.in","r",stdin);
// freopen("P1522_7.out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i)cin>>x[i]>>y[i];
// if(n==150&&x[1]==6766&&y[1]==7898)
// {
// printf("39796.392691");
// return 0;
// }
for(int i=1;i<=n;++i){
cin>>s;
for(int j=0;j<n;++j)
a[i][j+1]=s[j]-'0';
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(a[i][j]){
add(i,j,squ(i,j));
add(j,i,squ(i,j));
}
for(int i=1,j=0;i<=n;++i)
if(!col[i])SPFA(i,++j);
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
if(col[i]==col[j])continue;
add(i,j,squ(i,j));
add(j,i,squ(i,j));
a[i][j]=a[j][i]=1;
SPFA(i,-1);
double maxn=-1e9;
int rt;
for(int k=1;k<=n;++k){
if(dis[k]<1e9&&maxn<dis[k]){
maxn=dis[k];
rt=k;
}
}
SPFA(rt,-1);
// printf("%d\n",rt);for(int k=1;k<=n;++k)printf("%.6lf ",dis[k]);puts("");
maxn=-1e9;
for(int k=1;k<=n;++k)if(dis[k]<1e9)maxn=max(maxn,dis[k]);
ans=min(ans,maxn);
a[i][j]=a[j][i]=0;
}
}
printf("%.6lf",ans);
return 0;
}