#include <bits/stdc++.h>
using namespace std;
char buf[1 << 21], *p1 = buf, *p2 = buf;
template <class T>
void read(T &x) {
  x = 0;
  int c = getchar();
  int flag = 0;
  while (c < '0' || c > '9') flag |= (c == '-'), c = getchar();
  while (c >= '0' && c <= '9')
    x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
  if (flag) x = -x;
}
template <class T>
T _max(T a, T b) {
  return b < a ? a : b;
}
template <class T>
T _min(T a, T b) {
  return a < b ? a : b;
}
template <class T>
bool checkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <class T>
bool checkmin(T &a, T b) {
  return b < a ? a = b, 1 : 0;
}
const double eps = 1e-8;
int n;
set<pair<int, int> > S;
int x[105], y[105];
int sqr(int x) { return x * x; }
struct Point {
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
} a[105];
Point operator+(Point a, Point b) { return Point(a.x + b.x, a.y + b.y); }
Point operator-(Point a, Point b) { return Point(a.x - b.x, a.y - b.y); }
Point operator*(Point a, double b) { return Point(a.x * b, a.y * b); }
Point operator/(Point a, double b) { return Point(a.x / b, a.y / b); }
double operator*(Point a, Point b) { return a.x * b.y - b.x * a.y; }
double operator^(Point a, Point b) { return a.x * b.x + a.y * b.y; }
double norm(Point a) { return a ^ a; }
double dist(Point a, Point b) { return sqrt(norm(a - b)); }
Point rot90(Point a) { return Point(-a.y, a.x); }
Point LI(Point p1, Point v1, Point p2, Point v2) {
  double t = ((p2 - p1) * v2) / (v1 * v2);
  return p1 + v1 * t;
}
struct Circle {
  double x, y, r;
  Circle(double x = 0, double y = 0, double z = 0) : x(x), y(y), r(z) {}
};
vector<Circle> ans;
void run(Point X, Point Y, Point Z) {
  Point p = LI((X + Y) / 2.0, rot90(Y - X), (Y + Z) / 2.0, rot90(Z - Y));
  ans.push_back(Circle(p.x, p.y, dist(p, X)));
}
void init() {
  read(n);
  for (int i = 1; i <= n; ++i) {
    read(x[i]);
    read(y[i]);
    S.insert(make_pair(x[i], y[i]));
    a[i].x = x[i], a[i].y = y[i];
  }
}
void solve() {
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      for (int k = 1; k <= n; ++k) {
        if (i == j || i == k || j == k) continue;
        int A = sqr(x[i] - x[j]) + sqr(y[i] - y[j]);
        int B = sqr(x[i] - x[k]) + sqr(y[i] - y[k]);
        int C = sqr(x[j] - x[k]) + sqr(y[j] - y[k]);
        if (A + B == C) {
          int X = x[j] + x[k] - x[i], Y = y[j] + y[k] - y[i];
          if (S.count(make_pair(X, Y))) {
            ans.push_back(Circle((x[j] + x[k]) * 0.5, (y[j] + y[k]) * 0.5,
                                 sqrt(C) * 0.5));
          }
        }
      }
    }
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = i + 1; j <= n; ++j) {
      for (int k = j + 1; k <= n; ++k) {
        int A = sqr(x[i] - x[j]) + sqr(y[i] - y[j]);
        int B = sqr(x[i] - x[k]) + sqr(y[i] - y[k]);
        int C = sqr(x[j] - x[k]) + sqr(y[j] - y[k]);
        if (A + B > C && B + C > A && C + A > B) {
          run(a[i], a[j], a[k]);
        }
      }
    }
  }
  double tim = -1;
  for (int i = 0; i < (int)ans.size(); ++i) {
    Point O(ans[i].x, ans[i].y);
    int error = 0;
    for (int j = 1; j <= n; ++j) {
      if (sqrt(norm(a[j] - O)) + eps < ans[i].r) {
        error = 1;
      }
    }
    if (!error) checkmax(tim, ans[i].r);
  }
  if (tim < 0)
    printf("-1\n");
  else
    printf("%.12lf\n", tim);
}
int main() {
  init();
  solve();
  return 0;
}
