#include<bits/stdc++.h>
#define lcm(a,b) (a/__gcd(a,b))*b
#define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long int
#define vi vector<int>
#define vll vector<ll>
#define pb push_back
#define F first
#define S second
#define mp make_pair
//salida rapida "\n"
//DECIMALES fixed<<sp(n)<<x<<endl;
//gcd(a,b)= ax + by
//lCB x&-x
using namespace std;
int P[505];
vector<pair<double,double> >v;
int n;
double y,x;
void init(){
    for(int i=0;i<505;i++){
        P[i]=i;
    }
}
int _find(int x){
    if(P[x]==x){
        return x;
    }
    return P[x]=_find(P[x]);
}
void _union(int x, int y){
    x=_find(x);
    y=_find(y);
    P[x]=y;
}
bool f(double r){
    for(int i=0;i<n;i++){
        for(int l=i+1;l<n;l++){
            if(sqrt(abs(v[i].F-v[l].F)*abs(v[i].F-v[l].F)+abs(v[i].S-v[l].S)*abs(v[i].S-v[l].S))<r){
                _union(i,l);
            }
        }
    }
    for(int i=0;i<n;i++){
        if(100-v[i].S<r){
            //cout<<"hrera"<<endl;
           // cout<<100<<" - "<<v[i].S<<"  "<<r<<endl;
            _union(i,500);
        }
        if(v[i].S+100<r){
            _union(i,501);
        }
    }
    if(_find(500)==_find(501)){
        return false;
    }
    return true;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x>>y;
        v.pb({x,y});
    }
    double b=0.000001,e=100;
    double res;
    while(e-b>0.00000001){
        init();
        double mid=(b+e)/2;
        if(f(mid*2)){
            res=mid;
            b=mid+0.00000001;
        }else{
            e=mid-0.00000001;
        }
    }
    cout<<res<<endl;

    return 0;
}

#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(int)(n); i++)

using namespace std;
using LL = long long;
using P = pair<int,int>;

class UnionFind {
public:
    vector <LL> par;
    vector <LL> siz;

    UnionFind(LL sz_): par(sz_), siz(sz_, 1LL) {
        for (LL i = 0; i < sz_; ++i) par[i] = i;
    }
    void init(LL sz_) {
        par.resize(sz_);
        siz.assign(sz_, 1LL);
        for (LL i = 0; i < sz_; ++i) par[i] = i;
    }

    LL root(LL x) {
        while (par[x] != x) {
            x = par[x] = par[par[x]];
        }
        return x;
    }

    bool unite(LL x, LL y) {
        x = root(x);
        y = root(y);
        if (x == y) return false;
        if (siz[x] < siz[y]) swap(x, y);
        siz[x] += siz[y];
        par[y] = x;
        return true;
    }

    bool same(LL x, LL y) {
        return root(x) == root(y);
    }

    LL size(LL x) {
        return siz[root(x)];
    }
};

int main(){
	int N;
	cin >> N;
	vector<P> T(N);
	rep(i,N){
		int x, y;
		cin >> x >> y;
		T[i] = P(x,y);
	}
	rep(i,N){
		int x = T[i].first;
		if(i == 0 or T[i].first != T[i-1].first){
			T.emplace_back(x,100);
			T.emplace_back(x,-100);
		}
	}
	sort(T.begin(),T.end());
	int siz = T.size();
	//rep(i,siz) cout << T[i].second << endl;
	for(int r = 1; r <= 40000; r++){
		UnionFind uf(siz);
		rep(i,siz){
			for(int j=i+1; j<siz; j++){
				int dx = T[j].first - T[i].first;
				if(dx * dx >= r) break;
				int dy = T[j].second - T[i].second;
				if(dx*dx+dy*dy < r) uf.unite(i,j);
			}
		}
		rep(i,siz){
			if(T[i].second == 100){
				rep(j,siz){
					if(T[j].second != -100) continue;
					if(uf.same(i,j)){
						double ans = r - 1;
						cout << setprecision(15);
						cout << sqrt(ans)/2 << endl;
						return 0;
					}
				}
			}
			else if(T[i].second == -100){
				rep(j,siz){
					if(T[j].second != 100) continue;
					if(uf.same(i,j)){
						double ans = r - 1;
						cout << setprecision(15);
						cout << sqrt(ans)/2 << endl;
						return 0;
					}
				}
			}
			else continue;
		}
	}


	return 0;
}