#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const double PI = acos(-1);
pair<double, double> calcCenter(double x1, double x2, double x3, double y1, double y2, double y3)
{
    double cx, cy;
    //幾何学的に求める
    //thanks for https://blog.mori-soft.com/entry/%3Fp%3D170
    double ex, ey; //(x1, y1)と(x2, y2)の中点
    double fx, fy; //(x2, y2)と(x3, y3)の中点
    ex = (x1 + x2) / 2;
    ey = (y1 + y2) / 2;
    fx = (x2 + x3) / 2;
    fy = (y2 + y3) / 2;
    double tanCE = tan(atan((y2 - y1) / (x2 - x1)) + PI / 2);
    double tanCF = tan(atan((y3 - y2) / (x3 - x2)) + PI / 2);
    cx = (ey - fy - ex * tanCE + fx * tanCF) / (tanCF - tanCE);
    cy = ey - (ex - cx) * tanCE;
    return make_pair(cx, cy);
}

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    int N;
    cin >> N;
    vector<double> xPoints(N);
    vector<double> yPoints(N);
    for (int i = 0; i < N; i++)
    {
        double X, Y;
        cin >> X >> Y;
        xPoints.at(i) = X;
        yPoints.at(i) = Y;
    }
    double answer = 100000;
    //二点を直径にしたケースで満たすもの最小
    for (int i = 0; i < N - 1; i++)
    {
        for (int j = i + 1; j < N; j++)
        {
            double cx, cy;
            cx = (xPoints.at(i) + xPoints.at(j)) / 2;
            cy = (yPoints.at(i) + yPoints.at(j)) / 2;
            double r2 = sqrt(pow(abs(cx - xPoints.at(j)), 2) + pow(abs(cy - yPoints.at(j)), 2));
            r2 += 0.0000000001;
            bool isEncloseAll = true;
            for (int k = 0; k < N; k++)
            {
                double checkR2 = sqrt(pow(abs(cx - xPoints.at(k)), 2) + pow(abs(cy - yPoints.at(k)), 2));
                if (r2 < checkR2)
                {
                    isEncloseAll = false;
                    break;
                }
            }
            if (isEncloseAll)
            {
                answer = min(answer, r2);
            }
        }
    }
    //三点を外周に含むケースで満たすもの最小
    for (int i = 0; i < N - 2; i++)
    {
        for (int j = i + 1; j < N - 1; j++)
        {
            for (int k = j + 1; k < N; k++)
            {
                double cx, cy;
                tie(cx, cy) = calcCenter(xPoints.at(i), xPoints.at(j), xPoints.at(k), yPoints.at(i), yPoints.at(j), yPoints.at(k));

                double r2 = sqrt(pow(abs(cx - xPoints.at(i)), 2) + pow(abs(cy - yPoints.at(i)), 2));
                r2 = max(r2, sqrt(pow(abs(cx - xPoints.at(j)), 2) + pow(abs(cy - yPoints.at(j)), 2)));
                r2 = max(r2, sqrt(pow(abs(cx - xPoints.at(k)), 2) + pow(abs(cy - yPoints.at(k)), 2)));
                r2 += 0.0000000001;
                bool isEncloseAll = true;
                for (int m = 0; m < N; m++)
                {
                    double checkR2 = sqrt(pow(abs(cx - xPoints.at(m)), 2) + pow(abs(cy - yPoints.at(m)), 2));
                    if (r2 < checkR2)
                    {
                        isEncloseAll = false;
                        break;
                    }
                }
                if (isEncloseAll)
                {
                    answer = min(answer, r2);
                }
            }
        }
    }

    cout << fixed << setprecision(11) << answer << endl;
    return 0;
}


Measured memory_bytes: 384