/*---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---*/

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;

#define rep(a, b)      for(int a = 0; a < (b); ++a)
#define rep1(a, b, c)  for(int a = (b); a < (c); ++a)
#define rrep(a, b, c)  for(int a = (b); a > c; --a)
#define each(a, b)     for(auto& a : b)

#define sz(x)       (int)(x).size()
#define all(a)      (a).begin(),(a).end()
#define rall(a)     (a).rbegin(), (a).rend()

#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
#define dbg(x) cout << #x << " = " << x << endl;
#define vt vector
#define pii pair<int, int>
#define pll pair<ll, ll>
#define bitcnt(x) __builtin_popcount(x)
#define fbo(x) find_by_order(x)
#define ook(x) order_of_key(x)

template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <class T> bool umin(T& a, const T& b){
	return b<a?a=b, 1:0;
}
template <class T> bool umax(T& a, const T& b){
	return a<b?a=b, 1:0;
}

using ll = long long;
using ld = long double;
using str = string;

const int inf = (int)1e9 + 5;
const ll infl = (ll)1e18 + 5;
const int mod = 1e9 + 7;

const int d4i[4]={-1, 0, 1, 0}, d4j[4]={0, 1, 0, -1};
const int d8i[8]={-1, -1, 0, 1, 1, 1, 0, -1}, d8j[8]={0, 1, 1, 1, 0, -1, -1, -1};

/*---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---XXX---*/

struct UnionFindTree{
	vt<int> parent;
	vt<int> siz;

	UnionFindTree(int n){
		parent.resize(n);
		siz.resize(n, 1);
		rep(i, n) parent[i] = i;
	}

	int root(int x){
		return (x==parent[x]?x:parent[x]=root(parent[x]));
	}

	void unite(int x, int y){
		x = root(x); y = root(y);
		if(x==y) return;
		if(siz[x] < siz[y]) swap(x, y);
		siz[x] += siz[y];
		parent[x] = y;
	}

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

const int N = 100;
int n;
int x[N], y[N];

bool go(double m){
	UnionFindTree uft(n+2);
	rep(i, n){
		if(abs(100 - y[i]) <= 2*m) uft.unite(i, n);
		if(abs(100 + y[i]) <= 2*m) uft.unite(i, n+1);
		rep1(j, i+1, n){
			double d = sqrt(pow(x[i]-x[j], 2) + pow(y[i]-y[j], 2));
			if(d <= 2*m) uft.unite(i, j);
		}
	}
	return !(uft.same(n, n+1));
}

void solve(){
	cin >> n;
	rep(i, n) cin >> x[i] >> y[i];

	double l = 0, r = 100, m;
	while(r - l > 1e-6){
		m = (l+r)/2;
		if(go(m)) l = m;
		else r = m;
	}
	cout << fixed <<  setprecision(6) << l << '\n';
}


int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

const int maxn = 100 + 5;
const int modu = 1e9 + 7;
const double eps = 1e-5;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

typedef long long LL;

int n;
int nails[maxn][2];
bool g[205][205], vis[205];

bool dfs(int x) {
    vis[x] = true;
    if (x == n+1) return true;
    for (int i = 0; i <= n+1; ++i) {
        if (!vis[i] && g[x][i])
            if (dfs(i)) return true;
    }
    return false;
}

double dist2(int i, int j) {
    double x = nails[i][0] - nails[j][0];
    double y = nails[i][1] - nails[j][1];
    return x*x + y*y;
}

bool check(double radius) {
    memset(vis, 0, sizeof(vis));
    memset(g, 0, sizeof(g));
    for (int i = 0; i < n; ++i) {
        for (int j = i+1; j < n; ++j) {
            if (radius*radius*4 > dist2(i, j))
                g[i][j] = g[j][i] = true;
        }
        if (nails[i][1] < radius*2) g[i][n] = g[n][i] = true;
        if (200 - nails[i][1] < radius*2) g[i][n+1] = g[n+1][i] = true;
    }
    return !dfs(n);
}

double bs(double l, double r) {
    while (r-l >= eps) {
        double mid = (l+r) / 2;
        if (check(mid)) l = mid;
        else r = mid;
    }
    // for (int i = 0; i <= 200; ++i) {
    //     for (int j = 0; j <= 200; ++j)
    //         printf("%d", g[i][j]);
    //     printf("\n");
    // }
    return l;
}

int main() {
    // freopen("my.txt", "w", stdout);
	cin >> n;
    for (int i = 0; i < n; ++i) {
        scanf("%d%d", &nails[i][0], &nails[i][1]);
        nails[i][0] += 100;
        nails[i][1] += 100;
    }
    cout << bs(0, 100) << endl;
	return 0;
}
