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

#if DEBUG && !ONLINE_JUDGE
  #include "header.h"
#else
  #define debug(args...)
#endif

typedef vector<int> vi;
typedef pair<int,int> ii;
typedef long long lli;
typedef long double ld;

#define pb push_back
#define all(x) x.begin(),x.end()
#define SZ(x) (int)(x).size()
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define rep(i,a,b) for(auto i=(a);i<b;i++)

#define INF (int)1e9
#define EPS 1e-9
#define MOD 1000000007
void preprocess(void) {
  return;
}
vector<ii> pp;


template <class T> int sgn(T x) { return (x > 0) - (x < 0); }
template<class T>
struct Point {
 typedef Point P;
 T x, y;
 explicit Point(T x=0, T y=0) : x(x), y(y) {}
 bool operator<(P p) const { return tie(x,y) < tie(p.x,p.y); }
 bool operator==(P p) const { return tie(x,y)==tie(p.x,p.y); }
 P operator+(P p) const { return P(x+p.x, y+p.y); }
 P operator-(P p) const { return P(x-p.x, y-p.y); }
 P operator*(T d) const { return P(x*d, y*d); }
 P operator/(T d) const { return P(x/d, y/d); }
 T dot(P p) const { return x*p.x + y*p.y; }
 T cross(P p) const { return x*p.y - y*p.x; }
 T cross(P a, P b) const { return (a-*this).cross(b-*this); }
 T dist2() const { return x*x + y*y; }
 double dist() const { return sqrt((double)dist2()); }
 // angle to x-axis in interval [-pi, pi]
 double angle() const { return atan2(y, x); }
 P unit() const { return *this/dist(); } // makes dist()=1
 P perp() const { return P(-y, x); } // rotates +90 degrees
 P normal() const { return perp().unit(); }
 // returns point rotated 'a' radians ccw around the origin
 P rotate(double a) const {
  return P(x*cos(a)-y*sin(a),x*sin(a)+y*cos(a)); }
 friend ostream& operator<<(ostream& os, P p) {
  return os << "(" << p.x << "," << p.y << ")"; }
};
typedef Point<double> P;



double ccRadius(const P& A, const P& B, const P& C) {
 return (B-A).dist()*(C-B).dist()*(A-C).dist()/
   abs((B-A).cross(C-A))/2;
}
P ccCenter(const P& A, const P& B, const P& C) {
 P b = C-A, c = B-A;
 return A + (b*c.dist2()-c*b.dist2()).perp()/b.cross(c)/2;
}

P p1, p2, p3;

double sqr(double p) { return p*p; }

double R = 0;

bool solve() {
  double r = ccRadius(p1, p2, p3);
  R = r;
  P c = ccCenter(p1, p2, p3);
  int cnt = 0;
  for(auto x: pp) {
    double r1 = sqrt(sqr(x.fi - c.x) + sqr(x.se - c.y));
    if(r1 < r + 1e-8) cnt++;
  }
  if(cnt == SZ(pp)) return true;
  return false;
}

bool solve1() {
  double cx = (p1.x + p2.x)/2, cy = (p1.y + p2.y)/2;
  double r = sqrt(sqr(p1.x - p2.x) + sqr(p1.y - p2.y));
  r = r/2;
  R = r;
  int cnt = 0;
  for(auto x: pp) {
    double r1 = sqrt(sqr(x.fi - cx) + sqr(x.se - cy));
    if(r1 < r + 1e-8) cnt++;
  }
  if(cnt == SZ(pp)) return true;
  return false;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.precision(20);
  preprocess();
  int n; cin>>n;
  pp.resize(n);
  rep(i,0,n) {
    int x, y; cin>>x>>y;
    pp[i] = {x, y};
  }
  double ans = 1e18;
  rep(i,0,n) {
    rep(j,i+1,n) {
      rep(k,j+1,n) {
        p1.x = pp[i].fi;
        p1.y = pp[i].se;
        p2.x = pp[j].fi;
        p2.y = pp[j].se;
        p3.x = pp[k].fi;
        p3.y = pp[k].se;
        if(solve()) {
          if(R<ans) ans = R;
        }
      }
    }
  }
  rep(i,0,n) {
    rep(j,i+1,n) {
      p1.x = pp[i].fi; p1.y = pp[i].se;
      p2.x = pp[j].fi; p2.y = pp[j].se;
      if(solve1()) {
        if(R<ans) ans = R;
      }
    }
  }
  cout<<ans<<endl;
}



Measured memory_bytes: 256