import std.stdio, std.conv, std.array, std.string, std.algorithm, std.container, std.range, core.stdc.stdlib, std.math, std.typecons;
T[][] combinations(T)(T[] s, in int m) {   if (!m) return [[]];   if (s.empty) return [];   return s[1 .. $].combinations(m - 1).map!(x => s[0] ~ x).array ~ s[1 .. $].combinations(m); }

alias Point = Tuple!(double, "x", double, "y");
alias Circle = Tuple!(double, "x", double, "y", double, "r");

void main() {
  auto N = readln.chomp.to!int;

  Point[] points;
  foreach (i; 0..N) {
    Point p; readf("%s %s\n", &p.x, &p.y);
    points ~= p;
  }

  double max_dist = -1;
  Tuple!(int, int) max_pair;
  for (int i=0; i<N-1; i++) {
    for (int o=i+1; o<N; o++) {
      double dist = (points[i].x - points[o].x).abs + (points[i].y - points[o].y).abs;
      if (max_dist < dist) {
        max_dist = dist;
        max_pair[0] = i;
        max_pair[1] = o;
      }
    }
  }

  Circle circle = Circle(
    0.5*(points[max_pair[0]].x + points[max_pair[1]].x),
    0.5*(points[max_pair[0]].y + points[max_pair[1]].y),
    0.5*sqrt(pow(points[max_pair[0]].x - points[max_pair[1]].x, 2) + pow(points[max_pair[0]].y - points[max_pair[1]].y, 2))
  );
  auto circle_norm = circle.r * circle.r;

  double cross(Point a, Point b, Point c) {
    auto A = Point(b.x - a.x, b.y - a.y);
    auto B = Point(a.x - c.x, a.y - c.y);
    return A.x*B.y - A.y*B.x;
  }

  foreach(i; 0..N-2) {
    foreach(j; i+1..N-1) {
      foreach(k; j+1..N) {
        auto dist = pow(circle.x - points[k].x, 2) + pow(circle.y - points[k].y, 2);
        if (dist <= circle_norm) continue;
      }
    }
  }

  writefln("%.10f", circle.r);

}
