//#include <tourist>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <string>
#include <iomanip>
#include <limits>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <list>
#include <valarray>
#include <queue>
#include <tuple>
#include <deque>
#include <algorithm>
#include <numeric>
#include <iomanip>
#include <utility>
#include <complex>
#include <functional>
using namespace std;
const int MOD = 1000000007;
typedef long long ll;
typedef pair<ll, ll> p;
const int INF = (1 << 28);
const int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};
const int Dx[8] = {0, 1, 1, 1, 0, -1, -1, -1}, Dy[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
#define yes cout << "Yes" << endl
#define YES cout << "YES" << endl
#define no cout << "No" << endl
#define NO cout << "NO" << endl
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define INF 2e9
#define ALL(v) v.begin(), v.end()
//setprecision(15)有効数字15桁
//-std=c++14
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a, ll b)
{
    return a * b / gcd(a, b);
}
struct edge {
    int to, cost;
};
int n;
typedef long double number;
typedef valarray<number> point;
const int dim = 2;
 
number dot(const point& a, const point& b) {
  return (a * b).sum();
}
point cross(const point& a, const point& b) {
  return a.cshift(+1)*b.cshift(-1)
       - a.cshift(-1)*b.cshift(+1);
}
number dist2(const point& a, const point& b) {
  return dot(a-b, a-b);
}
 
struct min_ball {
    point center;
    number radius2;
    void add(const point& p) {
        ps.push_back(p);
    }
    void compile() {
        m = 0;
        center.resize(dim, 0);
        radius2 = -1;
        make_ball(ps.end());
    }
    template <class OUT>
        void support(OUT out) {
            copy(ps.begin(), supp_end, out);
        }
    min_ball() {
        for (int i = 0; i <= dim; ++i) {
            c[i].resize(dim, 0);
            v[i].resize(dim, 0);
        }
    }
    private:
    list<point> ps;
    list<point>::iterator supp_end;
    int m;
    point v[dim+1], c[dim+1];
    number z[dim+1], r[dim+1];
    void pop() { --m; }
    void push(const point& p) {
        if (m == 0) {
            c[0] = p; r[0] = 0;
        } else {
            number e = dist2(p, c[m-1]) - r[m-1];
            point delta = p - c[0];
            v[m] = p - c[0];
            for (int i = 1; i < m; ++i)
                v[m] -= v[i] * dot(v[i], delta) / z[i];
            z[m] = dot(v[m], v[m]);
            c[m] = c[m-1] + e*v[m]/z[m]/2;
            r[m] = r[m-1] + e*e/z[m]/4;
        }
        center  = c[m];
        radius2 = r[m]; ++m;
    }
    void make_ball(list<point>::iterator i) {
        supp_end = ps.begin();
        if (m == dim + 1) return;
        for (list<point>::iterator k = ps.begin(); k != i; ) {
            list<point>::iterator j = k++;
            if (dist2(*j, center) > radius2) {
                push(*j); make_ball(j); pop();
                move_to_front(j);
            }
        }
    }
    void move_to_front(list<point>::iterator j) {
        if (supp_end == j) ++supp_end;
        ps.splice (ps.begin(), ps, j);
    }
};
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> n;
    min_ball m;
    for (int i = 0; i < n; i++)
    {
        valarray<number> b(2);
        cin >> b[0]>>b[1];
        m.add(b);
    }
    m.compile();
    cout << setprecision(15)<<sqrt(m.radius2) << "\n";
}
//<参考文献>
//http://www.prefield.com/algorithm/geometry3D/min_ball.html


Measured memory_bytes: 256