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

// #include <boost/algorithm/string/join.hpp>
// using boost::algorithm::join;
//
// #include "boost/multi_array.hpp"
// boost::multi_array<int, 3> dp;
// dp.resize(boost::extents[10][9][8]);
//
// #include <boost/multiprecision/cpp_dec_float.hpp>  // quite slowly
// #include <boost/multiprecision/cpp_int.hpp>
// namespace mp = boost::multiprecision; // mp::log10
// using bigint = boost::multiprecision::cpp_int;
// using rational = mp::cpp_rational;  // double d = static_cast<double>(r);

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

typedef map<int, int> mii;
typedef pair<int, int> pii;
typedef pair<double,double> pdd;
typedef set<int> si;
typedef set<ll> sll;
typedef vector<int> vi;
typedef vector<pair<int, int > > vii;
typedef vector<ll> vll;
typedef vector<double> vd;
typedef vector<vi> vvi;
typedef vector<vii> vvii;
typedef vector<vll> vvll;

//constexpr ll MOD = 1e9+7;
//template<typename T>constexpr auto inf=numeric_limits<T>::max()/4;
//constexpr int INF=inf<int>;
//constexpr ll LINF=inf<ll>;

#define Sort(x) sort(begin(x),end(x))
#define Reverse(x) reverse(begin(x),end(x))
#define ABS(a,b) ((a)<(b)?(b)-(a):(a)-(b))
#define nbit(n) (1ull<<(n))
#define _ol3(_1,_2,_3,name,...)name
#define _rep(i,n)_repi(i,0,n)
#define _repi(i,a,b)for(int i=a,i##_l=(b);i<i##_l;++i)
#define REP(...) _ol3(__VA_ARGS__,_repi,_rep,)(__VA_ARGS__)
#define REPR(i,n) for(int i=n-1;i>=0;--i)
#define REPA(i,v) REP(i,(v).size())

// sort(begin(x), end(x), greater<ll>());
// lower_bound(a.begin(), a.end(), val): a[i] ≥ valである最左の位置
// upper_bound(a.begin(), a.end(), val): a[i] > valである最左の位置

// Returns minimum of a and b.
// If a is less b, a is set to b.
template<typename T>
T chmin(T& a, T b) {
  if (a > b) {
    a = b;
  }
  return a;
}

// Returns maximum of a and b.
// If a is less b, a is set to b.
template<typename T>
T chmax(T& a, T b) {
  if (a < b) {
    a = b;
  }
  return a;
}

template <typename T>
void dumpContents(const T& v, const string& msg)
{
  cerr << "### " << msg << " ###\n";
  for (const auto& x : v) {
    cerr << x << " ";
  }
  cerr << endl;
}

struct before_main_function {
  before_main_function() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout<<setprecision(20)<<fixed;
#define endl "\n"
  }
} before_main_function;

class P : public complex<long double> {
public:
  P(const complex<long double>& o)
    : complex<long double>(o) {}

  P(long double x, long double y)
    : complex<long double>(x, y) { }

  long double x() const {
    return real();
  }

  long double y() const {
    return imag();
  }
};

// ========== end of template ==========
int N;
vector<P> points;

// 点AとBから等距離rにある2点を返す
vector<P> get_centers(const P& A, const P& B, const long double r) {
  vector<P> ret;

  const P M = (A+B)/ld(2);

  long double am = abs(A-M);
  if (am > r) return ret;
  long double d = sqrt(r*r - am*am);
//cerr << "A " << A << " B " << B << " M " << M << " d " << d << " r " << r <<endl;

  P le = (A-B)/abs(A-B); // 直線ABの単位ベクトル
  le = le*P(0, 1); // 90度回転 => 直線ABの単位法線ベクトル

  P p1 = M + le*d;
  P p2 = M - le*d;

  return vector<P>{p1, p2};
}

long double check_enclose(const P& p, const P& A, const P& B, const long double r) {
  for (const auto& a : points) {
    if (a == A || a == B) continue;

    const long double d = abs(p-a);
    if (d>r) {
//cerr << "from " << p << " to a " << a << ", d " << d << ", r " << r << endl;
      return false;
    }
  }

  return true;
}

long double do_check(const long double r) {
  REP(i, N-1) {
    const P& A = points[i];

    REP(j, i+1, N) {
      const P& B = points[j];
      vector<P> cs = get_centers(A, B, r);
      if (cs.empty()) {
        //cerr << "no center for " << r << endl;
        continue;
      }

      for (const auto& p : cs) {
        if (check_enclose(p, A, B, r)) return true;
      }
    }
  }

  return false;
}

int main(int argc, char** argv) {
  cin >> N;
  points.reserve(N);
  REP(i, N) {
    long double x, y;
    cin >> x >> y;
    points.push_back({x, y});
  }

  long double l = 0;
  long double r = 1000.0*1.5;
  long double prev_m = -1;

  while (l<r) {
    long double m = (l+r)/2.0;
    if (ABS(prev_m, m) < 1e-7) {
      cout << m << endl;
      return 0;
    }

    //cerr << m << "\n" << do_check(m) << endl;

    if (do_check(m)) {
      r = m;
    } else {
      l = m;
    }

    prev_m = m;
  }

  return 0;
}

/* vim: set expandtab shiftwidth=2 softtabstop=2 : */


Measured memory_bytes: 512