#include "bits/stdc++.h"
#pragma GCC optimize("Ofast")

// Begin Header {{{
using namespace std;

#ifndef DEBUG
#define dump(...)
#endif

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define rep(i, n) for (intmax_t i = 0, i##_limit = (n); i < i##_limit; ++i)
#define reps(i, b, e) for (intmax_t i = (b), i##_limit = (e); i <= i##_limit; ++i)
#define repr(i, b, e) for (intmax_t i = (b), i##_limit = (e); i >= i##_limit; --i)
#define var(Type, ...) Type __VA_ARGS__; input(__VA_ARGS__)

constexpr size_t    operator""_zu(unsigned long long value) { return value; };
constexpr intmax_t  operator""_jd(unsigned long long value) { return value; };
constexpr uintmax_t operator""_ju(unsigned long long value) { return value; };

constexpr int INF = 0x3f3f3f3f;
constexpr intmax_t LINF = 0x3f3f3f3f3f3f3f3f_jd;

namespace moke {

template <class T> using MaxHeap = priority_queue<T, vector<T>, less<T>>;
template <class T> using MinHeap = priority_queue<T, vector<T>, greater<T>>;

inline void input() {}
template <class Head, class... Tail> inline void input(Head&& head, Tail&&... tail) {
    cin >> head;
    input(forward<Tail>(tail)...);
}

inline void outs() { cout << "\n"; }
template <class Head, class... Tail> inline void outs(Head&& head, Tail&&... tail) {
    cout << head << (sizeof...(tail) ? " " : "");
    outs(forward<Tail>(tail)...);
}

template <class T> inline void outs(vector<T> &vec) {
    for (auto &e : vec) cout << e << " \n"[&e == &vec.back()];
}

template <class T> inline void outs(vector<vector<T>> &df) {
    for (auto &vec : df) outs(vec);
}

inline void outl() { cout << "\n"; }
template <class Head, class... Tail> inline void outl(Head&& head, Tail&&... tail) {
    cout << head << (sizeof...(tail) ? "\n" : "");
    outl(forward<Tail>(tail)...);
}

template <class T> inline void outl(vector<T> &vec) {
    for (auto &e : vec) cout << e << "\n";
}

inline void outn() {}
template <class Head, class... Tail> inline void outn(Head&& head, Tail&&... tail) {
    cout << head;
    outn(forward<Tail>(tail)...);
}

template <class T> inline void outn(vector<T> &vec) {
    for (auto &e : vec) cout << e;
}

template <class T> inline vector<T> make_v(const T &initValue, size_t sz) {
    return vector<T>(sz, initValue);
}

template <class T, class... Args> inline auto make_v(const T &initValue, size_t sz, Args... args) {
    return vector<decltype(make_v<T>(initValue, args...))>(sz, make_v<T>(initValue, args...));
}

template <class A, class B> inline bool chmax(A &a, const B &b) noexcept {
    return b > a && (a = b, true);
}

template <class A, class B> inline bool chmin(A &a, const B &b) noexcept {
    return b < a && (a = b, true);
}

template <class A, class B> inline common_type_t<A, B> min(const A &a, const B &b) noexcept {
    return a < b ? a : b;
}

template <class A, class B, class... Args>
inline common_type_t<A, B, Args...> min(const A &a, const B &b, const Args&... args) noexcept {
    return moke::min(a < b ? a : b, args...);
}

template <class A, class B> inline common_type_t<A, B> max(const A &a, const B &b) noexcept {
    return a > b ? a : b;
}

template <class A, class B, class... Args>
inline common_type_t<A, B, Args...> max(const A &a, const B &b, const Args&... args) noexcept {
    return moke::max(a > b ? a : b, args...);
}

template <class A, class B> inline common_type_t<A, B> diff(const A &a, const B &b) noexcept {
    return a < b ? b - a : a - b;
}

} // namespace moke

// }}} End Header

namespace moke {

// MinimumInclusionCircle {{{
using P = complex<double>;
const double eps = 1e-10;

double cross(const P& a, const P& b) { return a.real() * b.imag() - a.imag() * b.real(); }

template <class iter> pair<P, double> MinimumInclusionCircle(iter left, iter right, int seed = 1933) {
    const int n = right - left;

    assert(n >= 1);
    if (n == 1) {
        return {*left, double(0)};
    }

    mt19937 mt(seed);
    shuffle(left, right, mt);

    iter ps = left;
    using circle = pair<P, double>;

    const auto make_circle_3 = [](const P &a, const P &b, const P &c) -> circle {
        double A = norm(b - c), B = norm(c - a), C = norm(a - b), S = cross(b - a, c - a);
        P p = (A * (B + C - A) * a + B * (C + A - B) * b + C * (A + B - C) * c) / (4 * S * S);
        double r2 = norm(p - a);
        return {p, r2};
    };

    const auto make_circle_2 = [](const P &a, const P &b) -> circle {
        P c = (a + b) / (double) 2;
        double r2 = norm(a - c);
        return {c, r2};
    };

    const auto in_circle = [](const P &a, const circle &c) -> bool {
        return norm(a - c.first) <= c.second + eps;
    };

    circle c = make_circle_2(ps[0], ps[1]);

    // MiniDisc
    for (int i = 2; i < n; ++i) {
        if (!in_circle(ps[i], c)) {
            // MiniDiscWithPoint
            c = make_circle_2(ps[0], ps[i]);
            for (int j = 1; j < i; ++j) {
                if (!in_circle(ps[j], c)) {
                    // MiniDiscWith2Points
                    c = make_circle_2(ps[i], ps[j]);
                    for (int k = 0; k < j; ++k) {
                        if (!in_circle(ps[k], c)) {
                            c = make_circle_3(ps[i], ps[j], ps[k]);
                        }
                    }
                }
            }
        }
    }

    return c;
}
// }}}

int main_() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    var(int, N);

    vector<P> t(N);
    rep(i, N) {
        var(int, x, y);
        t[i] = P(x, y);
    }

    pair<P, double> res = MinimumInclusionCircle(t.begin(), t.end());

    cout << fixed << setprecision(10);
    outl(sqrt(res.second));

    return 0;
}

} // namespace moke

signed main() { // {{{
    moke::main_();
    return 0;
} // }}}


Measured memory_bytes: 512