#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<map>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<cctype>
#define vec vector
#define que queue
#define u_map unordered_map
#define u_set unordered_set
#define _for(i,a,b) for(int i=(a);i<=(b);i++)
#define _rof(i,a,b) for(int i=(a);i>=(b);i--)
#define in(a) scanf("%d",&(a))
#define llin(a) scanf("%lld",&(a))
#define ins(a) scanf("%s",&(a))
#define out(a) printf("%d ",(a))
#define outn(a) printf("%d\n",(a))
#define llout(a) printf("%lld ",(a))
#define memset0(a) memset(a,0,sizeof(a))
#define memset127(a) memset(a,127,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
inline int read(){
int num=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<1)+(num<<3)+(c^48);c=getchar();}
return num*f;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
struct node{
double dis;
int u;
bool operator>(const node& a)const{return dis>a.dis;}
};
vector<int> fa;
inline void init(int n){_for(i,0,n) fa.push_back(i);}
inline int find(int u){return u==fa[u] ? u:fa[u]=find(fa[u]);}
int n=read();
int x[155],y[155];
double e[155][155];
double dis[155][155];
double maxdis[155],size[155];
inline double f(int a,int b){
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
signed main(){
init(n);
_for(i,1,n) x[i]=read(),y[i]=read();
_for(i,1,n) _for(j,1,n+1){
char p=getchar();
if(p=='1')
e[i][j]=f(i,j),fa[find(i)]=find(j);
}
_for(i,1,n) _for(j,1,n)
if(i==j) dis[i][j]=0;
else if(e[i][j]!=(double)0) dis[i][j]=e[i][j];
else dis[i][j]=1e9;
_for(k,1,n) _for(i,1,n) _for(j,1,n)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[j][k]);
double ans=1e9;
_for(i,1,n){
_for(j,1,n) if(find(i)==find(j)) maxdis[i]=max(maxdis[i],dis[i][j]);
size[find(i)]=max(size[find(i)],maxdis[i]);
}
_for(i,1,n) _for(j,1,n)
if(find(i)!=find(j)) ans=min(ans,max(maxdis[i]+maxdis[j]+f(i,j),max(size[find(i)],size[find(j)])));
printf("%.6lf",ans);
return 0;
}