#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define MOD 1000000007
#define INF 1000000000
#define INFLL 1000000000000000000LL
#define range(a, b, c) (a>=b && a<c)
#define stlfor(a, b) for(auto a=b.begin(); a!=b.end(); a++)
#define rstlfor(a, b) for(auto a=b.rbegin(); a!=b.rend(); a++)
#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#ifdef ONLINE_JUDGE
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
using namespace std;
using namespace __gnu_pbds;
typedef pair<int, int> pii;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> OS;

inline long long readli()
{
    register char c;
    for(c=getchar(); !(c>='0' && c<='9'); c=getchar());
    register long long a=c-'0';
    for(c=getchar(); c>='0' && c<='9'; c=getchar())
        a=(a<<3)+(a<<1)+c-'0';
    return a;
}

#define sq(a) ((a) * (a))
const double PI = 3.14159265359;

struct T
{
    double a;
    int c, i;
    bool ty;

    bool operator< (const T &x) const
    {
        if(a < x.a)
            return true;
        if(a == x.a and ty)
            return true;
        return false;
    }
};

int n, m;
vector<pair<double, double>> pts;
vector<int> cnt;

double setang(double v)
{
    if(v > PI)
        return v - PI - PI;
    if(v < -PI)
        return PI + PI + v;
    return v;
}

bool check(double rad)
{
    for(int i=0; i<n; i++)
    {
        vector<T> ang;
        vector<pair<double, double>> pt;
        int sz = 0;
        for(int j=0; j<n; j++)
        {
            double d = sqrt(sq(pts[j].ff - pts[i].ff) + sq(pts[j].ss - pts[i].ss));
            if(i == j or d > 2 * rad)
                continue;
            double s = atan((pts[j].ss - pts[i].ss) / (pts[j].ff - pts[i].ff));
            if(pts[i].ff > pts[j].ff)
                s += PI;
            double alpha = acos(d / (2 * rad));
            ang.pb({setang(s - alpha), cnt[j], sz, true});
            ang.pb({setang(s + alpha), cnt[j], sz, false});
            pt.pb(pts[j]);
            sz++;
        }
        sort(ang.begin(), ang.end());
        int nn = cnt[i];
        vector<bool> v(sz, false);
        for(auto &it : ang)
        {       if(it.ty)
            {
                if(!v[it.i])
                {
                    nn += it.c;
                    v[it.i] = true;
                }
            }
            else
            {
                if(v[it.i])
                {
                    nn -= it.c;
                    v[it.i] = false;
                }
            }
        }
        if(nn >= m)
            return true;
        for(auto &it : ang)
        {
            if(it.ty)
            {
                if(!v[it.i])
                {
                    nn += it.c;
                    v[it.i] = true;
                }
            }
                   else
            {
                if(v[it.i])
                {
                    nn -= it.c;
                    v[it.i] = false;
                }
            }
            if(nn >= m)
                return true;
        }
    }
    return false;
}

int main()
{
    int nn = readli();
    map<pair<double, double>, int> pm;
    for(int i=0; i<nn; i++)
    {
        double x, y;
        cin >> x >> y;
        pm[mp(x, y)]++;
    }
    m=nn;
    for(auto &it : pm)
    {
        pts.pb(it.ff);
        cnt.pb(it.ss);
        n++;
    }
    double r = 4000, l = 0;
    while(r - l > 1e-8)
    {
        double mid = (r + l) / 2;
        if(check(mid))
            r = mid;
        else
            l = mid;
    }
    cout << setprecision(10) << (r + l) / 2 << endl;
    return 0;
}

Measured memory_bytes: 512