#include<bits/stdc++.h>

using namespace std;

template<typename T> std::string toString(T val){std::ostringstream oss; oss << val; return oss.str();}
template<typename T, typename U> inline ostream &operator<< (ostream &_out, const pair<T, U> &_p) { _out << _p.first << ' ' << _p.second << '\n'; return _out; }
template<typename T, typename U> inline istream &operator>> (istream &_in, pair<T, U> &_p) { _in >> _p.first >> _p.second; return _in; }
template<typename T> inline ostream &operator<< (ostream &_out, const vector<T> &_v) { if (_v.empty()) { return _out; } _out << _v.front() << ' '; for (auto _it = ++_v.begin(); _it != _v.end(); ++_it) { _out << *_it <<' '; } return _out; }
template<typename T> inline istream &operator>> (istream &_in, vector<T> &_v) { for (auto &_i : _v) { _in >> _i; } return _in; }
template<typename T> inline ostream &operator<< (ostream &_out, const set<T> &_s) { if (_s.empty()) { return _out; } _out << *_s.begin(); for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) { _out << ' ' << *_it; } return _out; }
template<typename T> inline ostream &operator<< (ostream &_out, const multiset<T> &_s) { if (_s.empty()) { return _out; } _out << *_s.begin(); for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) { _out << ' ' << *_it; } return _out; }
template<typename T> inline ostream &operator<< (ostream &_out, const unordered_set<T> &_s) { if (_s.empty()) { return _out; } _out << *_s.begin(); for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) { _out << ' ' << *_it; } return _out; }
template<typename T> inline ostream &operator<< (ostream &_out, const unordered_multiset<T> &_s) { if (_s.empty()) { return _out; } _out << *_s.begin(); for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) { _out << ' ' << *_it; } return _out; }
template<typename T, typename U> inline ostream &operator<< (ostream &_out, const map<T, U> &_m) { if (_m.empty()) { return _out; }for (auto _it:_m) { _out << _it.first << ": " << _it.second << '\n'; } return _out; }

#define pb push_back
//#define int long long
#define X first
#define Y second
#define pog double
#define all(x) x.begin(),x.end()

vector<int> dx = {1, -1, 0, 0};
vector<int> dy = {0, 0, 1, -1};

//int dx[8] = {2, 2, 1, 1, -1, -1, -2, -2};
//int dy[8] = {1, -1, 2, -2, 2, -2, 1, -1};

struct cord{
    int x, y, z;
};

vector<int> zfun(string s){
    int n = s.size();
    vector<int> z(n,0);
    for(int i = 1, l = 0, r = 0;i < n;i++){
        if(i <= r)
            z[i] = min(r - i + 1, z[i - l]);
        while(i + z[i] < n && s[z[i]] == s[i + z[i]])
            z[i]++;
        if(i + z[i] - 1 > r)
            l = i, r = i + z[i] - 1;
    }
    return z;
}

int mod = 1e9 + 7;
long long bin_pow(long long base, long long p) {
    int res = 1;
    while(p){
        if(p & 1)
            res = (res * base) % mod;
        base = (base * base) % mod;
        p /= 2;
    }
    return res;
}

long long inverse_element(long long x) {
    return bin_pow(x, mod - 2);
}

long long divide(long long a, long long b) {
    return a * inverse_element(b) % mod;
}
int& tests(){
    static int tests;
    return tests;
}
void en(int num){
    cout <<  (num == 1 ? "YES" : "NO");
    exit(0);
}
int in(pair<pog, pog> point, pair<pog, pog> st, pog r){
    return (point.X - st.X) * (point.X - st.X) + (point.Y - st.Y) * (point.Y - st.Y) - r * r <= 1e-7;
}
pair<double, double> getc(pair<pog, pog> x1, pair<pog, pog> x2, pair<pog, pog> x3){
    pog z1 = x1.X * x1.X + x1.Y * x1.Y;
    pog z2 = x2.X * x2.X + x2.Y * x2.Y;
    pog z3 = x3.X * x3.X + x3.Y * x3.Y;
    pog zx = (x1.Y - x2.Y) * z3 + (x2.Y - x3.Y) * z1 + (x3.Y - x1.Y) * z2;
    pog zy = (x1.X - x2.X) * z3 + (x2.X - x3.X) * z1 + (x3.X - x1.X) * z2;
    pog z = (x1.X - x2.X) * (x3.Y - x1.Y) - (x1.Y - x2.Y) * (x3.X - x1.X);
    return {zx / (-2.0 * z), zy / (2.0 * z)};
}
vector<pair<pog, pog> > centrs;
int check(pog m, vector<pair<int,int> > &a){
    for(int i = 0;i < a.size();i++){
        for(int j = i + 1;j < a.size();j++){
            pog stPX = (pog)(a[j].X - a[i].X) / (pog)2 + (pog)a[i].X, stPY = (pog)(a[j].Y - a[i].Y) / (pog)2 + (pog)a[i].Y;
            int cant = 1;
            for(auto point: a){
                if(!in(point, {stPX, stPY}, m)) cant = 0;
            }
            if(cant) return 1;
        }
    }

    for(auto &c: centrs){
        int cant = 1;
        for(auto &point: a){
            if(!in(point, c, m)) cant = 0;
        }
        if(cant) return 1;
    }

    return 0;
}
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    vector<pair<int,int> > a(n);
    cin >> a;
    for(int i = 0;i < a.size();i++) {
        for (int j = i + 1; j < a.size(); j++) {
            for (int k = j + 1; k < a.size(); k++) {
                auto c = getc(a[i], a[j], a[k]);
                centrs.push_back(c);
            }
        }
    }
    pog l = 0, r = 1e3 + 10;
    while(abs(r - l) >= 1e-7){
        pog m = (r + l) / 2.0;
        if (check(m, a)){
            r = m;
        }
        else{
            l = m;
        }
    }
    cout << fixed << setprecision(10) << r;
    return 0;
}

Measured memory_bytes: 892