#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int x[100],y[100],z[100],n,all;
int f[100],l[100],d[100][100];

class Dinic{
public:
    static const int INF = 1000000007, SIZE = 205;
    int c[SIZE][SIZE];
    int n,s,t,l[SIZE],e[SIZE];
    int flow(int maxf = INF){
        int left=maxf;
        while(build()) left-=push(s,left);
        return maxf-left;
    }
    int push(int x, int f){
        if(x==t) return f;
        int& y=e[x],sum=f;
        for(;y<n;y++) if(c[x][y]>0 && l[x]+1==l[y]){
            int cnt=push(y,min(sum,c[x][y]));
            c[x][y]-=cnt;
            c[y][x]+=cnt;
            sum-=cnt;
            if(!sum) return f;
        }
        return f-sum;
    }
    bool build(){
        int m=0;
        memset(l,255,sizeof(l));
        l[e[m++]=s]=0;
        for(int i=0;i<m;i++) for(int y=0;y<n;y++)
            if(c[e[i]][y]>0 && l[y]<0) l[e[m++]=y]=l[e[i]]+1;
        memset(e,0,sizeof(e));
        return l[t]>=0;
    }
}net;

bool gao(int r, int tmp){
    memset(net.c,0,sizeof(net.c));
    for(int i=0;i<n;i++){
        net.c[n+n][i]=f[i];
        net.c[i][i+n]=l[i];
        for(int j=0;j<n;j++)
            if(d[i][j]<=r) net.c[i+n][j]=Dinic::INF;
    }
    net.n=n+n+1;
    net.s=n+n;
    net.t=0;
    return net.flow()!=all;
}

int main(){
    while(scanf("%d",&n)==1){
        vector<int> u;
        all=0;
        for(int i=0;i<n;i++){
            scanf("%d%d%d%d%d",x+i,y+i,z+i,f+i,l+i);
            all+=f[i];
            for(int j=0;j<i;j++){
                int dx=x[i]-x[j];
                int dy=y[i]-y[j];
                int dz=z[i]-z[j];
                u.push_back(d[i][j]=d[j][i]=dx*dx+dy*dy+dz*dz);
            }
        }
        sort(u.begin(),u.end());
        u.erase(unique(u.begin(),u.end()),u.end());
        size_t i=lower_bound(u.begin(),u.end(),0,gao)-u.begin();
        if(i==u.size()) puts("-1"); else
                        printf("%.7f\n",sqrt(u[i]));
    }
}
