#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
  point() {}
  point(double a, double b) {
    x = a;
    y = b;
  }
  point ort() { return point(-y, x); }
};
point operator+(const point &a, const point &b) {
  return point(a.x + b.x, a.y + b.y);
}
point operator-(const point &a, const point &b) {
  return point(a.x - b.x, a.y - b.y);
}
point operator/(const point &a, double k) { return point(a.x / k, a.y / k); }
point operator*(const point &a, double k) { return point(a.x * k, a.y * k); }
double dist(const point &A, const point &B) {
  return hypot(A.x - B.x, A.y - B.y);
}
double cross(const point &A, const point &B) { return A.x * B.y - A.y * B.x; }
double dot(const point &A, const point &B) { return A.x * B.x + A.y * B.y; }
double area(const point &A, const point &B, const point &C) {
  return cross(B - A, C - A);
}
point lineIntersection(const point &A, const point &B, const point &C,
                       const point &D) {
  return A + (B - A) * (cross(C - A, D - C) / cross(B - A, D - C));
}
bool valid(const point &a, const point &b, const point &c) {
  if (dot(b - a, c - a) <= 0) return 0;
  if (dot(a - b, c - b) <= 0) return 0;
  if (dot(a - c, b - c) <= 0) return 0;
  return 1;
}
point get(const point &a, const point &b, const point &c) {
  point mid1 = (a + b) / 2;
  point dir1 = (b - a);
  point mid2 = (a + c) / 2;
  point dir2 = (c - a);
  return lineIntersection(mid1, mid1 + dir1.ort() * 10000, mid2,
                          mid2 + dir2.ort() * 10000);
}
point plano[123];
pair<int, int> planoint[123];
int n;
bool dif(pair<int, int> a, pair<int, int> b) {
  return a.first != b.first && a.second != b.second;
}
bool found(pair<int, int> a, int &last) {
  for (int i = 0; i < n; ++i)
    if (planoint[i] == a) {
      last = i;
      return 1;
    }
  return 0;
}
double valid(int x, int y, int z) {
  pair<int, int> a = planoint[x], b = planoint[y], c = planoint[z];
  if (!dif(a, b)) return -1.0;
  if (abs(a.first - b.first) != abs(a.second - b.second)) return -1.0;
  int lado = abs(a.first - b.first);
  if (a.second > b.second) swap(a, b);
  bool ok = 0;
  int last;
  if (c == pair<int, int>(a.first + lado, a.second) &&
      found(pair<int, int>(a.first, a.second + lado), last))
    ok = 1;
  if (!ok && c == pair<int, int>(a.first, b.second + lado) &&
      found(pair<int, int>(a.first + lado, a.second), last))
    ok = 1;
  if (!ok) return -1.0;
  point mid = point((a.first + b.first) / 2.0, (a.second + b.second) / 2.0);
  double radio = dist(mid, point(a.first, b.first));
  for (int i = 0; i < n; ++i)
    if (i != x && i != y && i != z && i != last &&
        dist(mid, plano[i]) + 1e-9 <= radio)
      return -1.0;
  return radio;
}
int main() {
  int x, y;
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    scanf("%d %d", &x, &y);
    plano[i] = point(x, y);
    planoint[i] = pair<int, int>(x, y);
  }
  double res = -1;
  for (int a = 0; a < n; ++a)
    for (int b = a + 1; b < n; ++b)
      for (int c = b + 1; c < n; ++c) {
        if (!valid(plano[a], plano[b], plano[c])) continue;
        point circunradio = get(plano[a], plano[b], plano[c]);
        double radio = dist(circunradio, plano[a]);
        bool covered = 0;
        for (int i = 0; i < n; ++i)
          if (i != a && i != b && i != c &&
              dist(circunradio, plano[i]) + 1e-9 <= radio) {
            covered = 1;
            break;
          }
        if (!covered) res = max(res, radio);
      }
  sort(planoint, planoint + n);
  for (int a = 0; a < n; ++a)
    for (int b = a + 1; b < n; ++b)
      for (int c = b + 1; c < n; ++c) {
        double p = valid(a, b, c);
        if (p > 0) res = max(res, p);
        p = valid(a, c, b);
        if (p > 0) res = max(res, p);
        p = valid(b, c, a);
        if (p > 0) res = max(res, p);
      }
  printf("%.10f\n", res);
  return 0;
}
