#include <bits/stdc++.h>
#include <ext/rope>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define ll long long
#define int long long
#define pb push_back
#define x first
#define ld long double
#define y second
#define mk(a,b) make_pair(a,b)
#define rr return 0
#define sqr(a) ((a)*(a))
#define all(a) a.begin(),a.end()

using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
template<class value, class cmp = less<value> >
using ordered_set = tree<value, null_type, cmp, rb_tree_tag, tree_order_statistics_node_update>;
template<class value, class cmp = less_equal<value> >
using ordered_multiset = tree<value, null_type, cmp, rb_tree_tag, tree_order_statistics_node_update>;
template<class key, class value, class cmp = less<key> >
using ordered_map = tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>;

/// find_by_order()
/// order_of_key()
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
inline int randll(int l = INT_MIN, int r = INT_MAX) {
    return uniform_int_distribution<int>(l, r)(rng);
}
inline ld randld(ld l = INT_MIN, ld r = INT_MAX) {
    return uniform_real_distribution<ld>(l, r)(rng);
}
struct circle{
    double x,y,r;
    bool operator ==(circle b){
        return x==b.x && y==b.y;
    }
};
struct line{
    double a,b,c;
};
struct point{
    double x,y;
};
int straight_contact_cricle (circle o, line l, point &a, point &b)
{
    point t;
    double EPS = 1e-8;
    l.c = l.a * o.x + l.b * o.y + l.c;
    t.x = -l.a * l.c / (l.a*l.a + l.b*l.b);
    t.y = -l.b * l.c / (l.a*l.a + l.b*l.b);
    if (l.c*l.c > o.r*o.r*(l.a*l.a + l.b*l.b) + EPS)
    return 0;
    else if(abs(l.c*l.c - o.r*o.r*(l.a*l.a + l.b*l.b)) < EPS)
    {
    a.x = t.x;
    a.y = t.y;
    return 1;
    }
    else
    {
    double d = o.r*o.r -l.c*l.c / (l.a*l.a + l.b*l.b);
    double mult = sqrt (d / (l.a*l.a + l.b*l.b));
    a.x = t.x + l.b * mult + o.x;
    a.y = t.y - l.a * mult + o.y;
    b.x = t.x - l.b * mult + o.x;
    b.y = t.y + l.a * mult + o.y;
    return 2;
    }
}
set<pair<ld, ld> > have;
inline void doit (circle a, circle b) {
    line c;
    c.a=2*b.x-2*a.x;
    c.b=2*b.y-2*a.y;
    c.c=sqr(a.x)+sqr(a.y)-sqr(b.x)-sqr(b.y)+sqr(b.r)-sqr(a.r);
    point ans,ans2;
    int d=straight_contact_cricle(b,c,ans,ans2);
    if(d==0){
    }
    else if(d==1){
        have.insert({ans.x+b.x,ans.y+b.y});
    }
    else{
        have.insert({ans.x, ans.y});
        have.insert({ans2.x, ans2.y});
    }
}
const ld EPS = 1e-7;
inline int cool (const vector <pair<int, int> > &a, ld r, ld x, ld y) {
    int cnt = 0;
    for (auto &i : a) {
        if (sqr(i.x - x) + sqr(i.y - y) <= r * r + EPS) ++cnt;
    }
    return cnt;
}

inline bool check (const vector <pair<int, int> > &a, ld R) {
    have.clear();
    int n = (int)a.size();
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            circle a1; a1.r = R, a1.x = a[i].x, a1.y = a[i].y;
            circle a2; a2.r = R, a2.x = a[j].x, a2.y = a[j].y;
            doit(a1, a2);
        }
    }
    for (auto &i : have) {
        if (cool(a, R, i.x, i.y) == n) return 1;
    }
    rr;
}
main()
{
    ios::sync_with_stdio(0);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    vector <pair<int, int> > a(n);
    for (auto &i : a) cin >> i.x >> i.y;
    ld l = 0, r = 1e3 * 2 + 1;
    while (r - l > EPS) {
        ld mid = (l + r) / 2.0;
        if (check(a, mid)) r = mid;
        else l = mid + EPS;
    }
    cout << fixed;
    cout.precision(10);
    cout << l << '\n';
}


Measured memory_bytes: 512