#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int sign(double x) { return x < -(1e-4) ? -1 : x > (1e-4); }
struct pt {
  double x, y;
  pt(double _x = 0, double _y = 0) : x(_x), y(_y) {}
  inline pt operator-(const pt &p) const { return pt(x - p.x, y - p.y); }
  inline pt operator+(const pt &p) const { return pt(x + p.x, y + p.y); }
  inline pt operator*(const double k) const { return pt(x * k, y * k); }
  inline double operator^(const pt &p) const { return x * p.y - y * p.x; }
  inline bool read() { return scanf("%lf%lf", &x, &y) == 2; }
  inline double abs() const { return sqrt(x * x + y * y); }
};
const int maxn = 100;
pt ps[maxn];
struct line {
  double a, b, c;
  line(double _a = 0, double _b = 0, double _c = 0) : a(_a), b(_b), c(_c) {}
  inline double get(const pt &p) const { return a * p.x + b * p.y + c; }
};
line getserp(const pt &p1, const pt &p2) {
  line res(p1.x - p2.x, p1.y - p2.y, 0);
  res.c = -res.get((p1 + p2) * 0.5);
  return res;
}
bool intersec(const line &l1, const line &l2, pt &res) {
  double D = l1.a * l2.b - l1.b * l2.a;
  if (!sign(D)) return 0;
  res = pt((l2.c * l1.b - l2.b * l1.c) / D, (l2.a * l1.c - l2.c * l1.a) / D);
  assert(!sign(l1.get(res)));
  assert(!sign(l2.get(res)));
  return 1;
}
bool getCenter(const pt &p1, const pt &p2, const pt &p3, pt &res) {
  return intersec(getserp(p1, p2), getserp(p2, p3), res);
}
int used[maxn][maxn][maxn];
int qsid[maxn];
pt qs[maxn];
double solve(const pt &p1, const pt &p2, const pt &p3, const pt &O, int n) {
  double R = (O - p1).abs();
  assert(!sign((O - p2).abs() - R) && !sign((O - p3).abs() - R));
  bool fail = 0;
  int m = 0;
  for (int i = 0; i < n; i++) {
    int tmp;
    if (!(tmp = sign((O - ps[i]).abs() - R))) qsid[m++] = i;
    if (tmp == -1) fail = 1;
  }
  assert(m >= 3);
  for (int i = 0; i < m; i++)
    for (int j = i + 1; j < m; j++)
      for (int y = j + 1; y < m; y++) used[qsid[i]][qsid[j]][qsid[y]] = 1;
  if (fail) return -1;
  for (int i = 0; i < m; i++) qs[i] = (ps[qsid[i]] - O);
  for (int iter = 0; iter < 2; iter++) {
    for (int i = 1; i < m; i++)
      if ((qs[i] ^ qs[0]) > 0) swap(qs[i], qs[0]);
  }
  for (int i = 1; i < m; i++) {
    if (sign(qs[0] ^ qs[i]) == -1) return R;
  }
  return -1;
}
int main() {
  srand(rdtsc());
  int n;
  while (scanf("%d", &n) >= 1) {
    for (int i = 0; i < n; i++) assert(ps[i].read());
    for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++)
        for (int k = j + 1; k < n; k++) used[i][j][k] = 0;
    double ans = -1;
    for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++)
        for (int k = j + 1; k < n; k++) {
          if (used[i][j][k]) continue;
          used[i][j][k] = 1;
          pt O;
          if (!getCenter(ps[i], ps[j], ps[k], O)) continue;
          ans = max(ans, solve(ps[i], ps[j], ps[k], O, n));
        }
    printf("%.18lf\n", ans);
  }
  return 0;
}
