#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi firstk
#define se second
#define SZ(x) ((int)(x).size())
#define mem(a,b) memset(a,b,sizeof (a))
#define ios stkd::ios::sync_with_stkdio(false); stkd::cin.tie(0); stkd::cout.tie(0);
// ios  can not be used with scanf,printf.  IF  ios MUstk cin,cout. 
typedef long long ll;
typedef vector<int> VI;
typedef pair<int,int> PII;
const ll mod=1000000;
const int INF=0x3f3f3f3f;
ll ksm(ll a,ll b){ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}

const int N=1510;
int n;
int fa[N];
double x[N],y[N];
int find(int x){
    if(fa[x]!=x){
        fa[x]=find(fa[x]);
    }
    return fa[x];
}
double dis(double x1,double y1,double x2,double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool check(double r){
    for(int i=0;i<=n+1;i++)fa[i]=i;
    for(int i=1;i<=n;i++){
        if(100-y[i]<2*r)fa[find(i)]=find(0);
        if(abs(-100-y[i])<2*r)fa[find(i)]=find(n+1);
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            int a=find(i),b=find(j);
            if(dis(x[i],y[i],x[j],y[j])<2*r){
                fa[b]=a;
            }
        }
    }
    return find(0)==find(n+1);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&x[i],&y[i]);
    }
    double l=1,r=100;
    while(r-l>1e-5){
        double mid=(l+r)/2;
        if(check(mid))r=mid;
        else l=mid;
    }
    printf("%.4lf\n",r);
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

struct UnionFind {
    vector<int> par;
    vector<int> sz;

    UnionFind(int n=0){ if(n>0) initialize(n); }
    void initialize(int n){
        par.resize(n);
        sz.assign(n, 1);
        for(int i=0; i<n; i++){
            par[i] = i;
        }
    }

    int find(int x){
        if(par[x] == x){
            return x;
        }else{
            return par[x] = find(par[x]);
        }
    }

    bool unite(int x, int y){
        x = find(x), y = find(y);
        if(x == y) return false;
        if(sz[x] > sz[y]) swap(x, y);
        par[x] = y;
        sz[y] += sz[x];
        return true;
    }

    bool same(int x, int y){ return find(x) == find(y); }
    int size(int x){ return sz[find(x)]; }
};

int main(){
    int N;
    cin >> N;
    vector<double> X(N), Y(N);
    for(int i=0; i<N; i++) cin >> X[i] >> Y[i];

    using T = tuple<double, int, int>;
    vector<T> es;
    for(int i=0; i<N; i++) for(int j=0; j<i; j++) es.emplace_back(hypot(X[i]-X[j], Y[i]-Y[j]), i, j);
    for(int i=0; i<N; i++){
        es.emplace_back(100-Y[i], i, N);
        es.emplace_back(Y[i]+100, i, N+1);
    }
    sort(es.begin(), es.end());

    UnionFind uf(N+2);
    for(auto& [d, a, b] : es){
        uf.unite(a, b);
        if(uf.same(N, N+1)){
            cout << fixed << setprecision(10) << d/2 << endl;
            return 0;
        }
    }

    return 0;
}
