#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> ii;
typedef long long ll;
const int oo = 1e9 + 7;
const int modulo = 1e9 + 7;
template<typename T>
inline T sum(const T& a, const T& b) { return T((a % modulo + b % modulo) % modulo); }
template<typename T>
inline T mul(const T& a, const T& b) { return T((1LL * (a % (1LL * modulo)) * (b % (1LL * modulo))) % (1LL * modulo)); }
string to_string(string a) { return "\"" + a + "\""; }
#ifdef __LOCAL_DEBUG
#define debug(args...) { string __out = #args; replace(__out.begin(), __out.end(), ',', ' '); stringstream __out_ss(__out);\
istream_iterator<string> __it(__out_ss); _debug(__it, args); }
void _debug(istream_iterator<string> it) { }
template<typename T, typename... Args>
void _debug(istream_iterator<string> it, T a, Args... args){ cerr << *it << " = " << to_string(a) << '\n'; _debug(++it, args...); }
#else
#define debug(...)
#endif

struct pt { double x, y; pt(const double& _x = 0, const double& _y = 0) { x = _x; y = _y; } };
double dist(const pt& a, const pt& b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); }

struct vec {
  double u, v;
  vec(const double& _u = 0, const double _v = 0) { u = _u; v = _v; }
  vec(const pt& a, const pt& b) { u = b.x - a.x; v = b.y - a.y; }
};
vec operator+(const vec& a, const vec& b) { return vec(a.u + b.u, a.v + b.v); }
vec operator-(const vec& a, const vec& b) { return vec(a.u - b.u, a.v - b.v); }
double dot(const vec& a, const vec& b) { return a.u * b.u + a.v * b.v; }

struct line {
  double a, b, c;
  line(const double& _a = 0, const double& _b = 0, const double& _c = 0) { a = _a; b = _b; c = _c; }
  line(const pt& q, const vec& w) {
    a = w.u; b = w.v;
    c = w.u * q.x + w.v * q.y;
  }
};
string to_string(const line& l) { return to_string(l.a) + "x + "+ to_string(l.b) + "y = " + to_string(l.c); }
pt solve(const line& d1, const line& d2, int& result) {
  pt res;
  double d = d1.a * d2.b - d2.a * d1.b;
  double dx = d1.c * d2.b - d2.c * d1.b;
  double dy = d1.a * d2.c - d2.a * d1.c;
  if (d == 0) {
    if (dx + dy == 0) result = -1;
    else result = +1;
  }
  else {
    res.x = dx / d;
    res.y = dy / d;
    result = 0;
  }
  return res;
}

int n;
double x[51], y[51];

double _solve(pt w) {
  double res = 0.0;
  for (int i = 1; i <= n; ++i)
    res = max(res, dist(w, pt(x[i], y[i])));
  return res;
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout << setprecision(15) << fixed;
  cin >> n;
  for (int i = 1; i <= n; ++i)
    cin >> x[i] >> y[i];
  double ans = 1e9 + 7;
  for (int i = 1; i <= n - 1; ++i)
    for (int j = i + 1; j <= n; ++j) {
      ans = min(ans, _solve(pt((x[i] + x[j]) / 2, (y[i] + y[j]) / 2)));
    }
  for (int i = 1; i <= n - 2; ++i)
    for (int j = i + 1; j <= n - 1; ++j)
      for (int k = j + 1; k <= n; ++k) {
        int res = 0;
        pt A(x[i], y[i]), B(x[j], y[j]), C(x[k], y[k]);
        pt t1((A.x + B.x) / 2, (A.y + B.y) / 2);
        pt t2((B.x + C.x) / 2, (B.y + C.y) / 2);
        line d1(t1, vec(A, B));
        line d2(t2, vec(B, C));
        pt w = solve(d1, d2, res);
        if (res == 0) {
          ans = min(ans, _solve(w));
        }
      }
  cout << ans;
  return 0;
}


Measured memory_bytes: 256