#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
struct Vec {
  double x, y;
  Vec() {}
  Vec(double _x, double _y) : x(_x), y(_y) {}
  inline double len2() const { return x * x + y * y; }
};
inline Vec operator+(const Vec &a, const Vec &b) {
  return Vec(a.x + b.x, a.y + b.y);
}
inline Vec operator-(const Vec &a, const Vec &b) {
  return Vec(a.x - b.x, a.y - b.y);
}
template <typename T>
inline Vec operator*(const Vec &a, T b) {
  return Vec(a.x * b, a.y * b);
}
template <typename T>
inline Vec operator*(T b, const Vec &a) {
  return Vec(a.x * b, a.y * b);
}
template <typename T>
inline Vec operator/(const Vec &a, T b) {
  return Vec(a.x / b, a.y / b);
}
inline double dot(const Vec &a, const Vec &b) { return a.x * b.x + a.y * b.y; }
inline double cross(const Vec &a, const Vec &b) {
  return a.x * b.y - a.y * b.x;
}
inline Vec ROT(const Vec &a) { return Vec(a.y, -a.x); }
inline Vec intersect(const Vec &a, const Vec &b, const Vec &c, const Vec &d) {
  Vec e = a + b, f = c + d;
  double s1 = cross(c - e, f - e), s2 = cross(f - a, c - a);
  return a + b * (s2 / (s1 + s2));
}
inline bool gt0(double a) { return a > -eps; }
inline bool lt0(double a) { return a < eps; }
inline bool eq0(double a) { return -eps <= a && a <= eps; }
inline bool lt(double a, double b) { return a + eps < b; }
int n;
Vec pl[110];
double ans = -1e8;
Vec m1, m2, v1, v2, O, tp;
double cl;
set<pair<int, int> > hsh;
inline bool check(int i, int j, int k) {
  for (int l = 1; l <= n; l++)
    if (l != i && l != j && l != k && lt((pl[l] - O).len2(), cl)) return false;
  double p1 = dot(pl[j] - pl[i], pl[k] - pl[i]),
         p2 = dot(pl[i] - pl[j], pl[k] - pl[j]),
         p3 = dot(pl[i] - pl[k], pl[j] - pl[k]);
  if (p1 > 0 && p2 > 0 && p3 > 0) return true;
  if (p1 < 0 || p2 < 0 || p3 < 0) return false;
  if (int(p1) == 0) swap(i, k);
  if (int(p2) == 0) swap(j, k);
  tp = pl[i] + (pl[j] - pl[k]);
  return hsh.count(pair<int, int>(int(tp.x), int(tp.y)));
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%lf%lf", &pl[i].x, &pl[i].y),
        hsh.insert(pair<int, int>(int(pl[i].x), int(pl[i].y)));
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
      for (int k = j + 1; k <= n; k++)
        if (!eq0(cross(pl[i] - pl[k], pl[j] - pl[k]))) {
          m1 = (pl[i] + pl[k]) / 2, m2 = (pl[k] + pl[j]) / 2;
          v1 = ROT(pl[i] - pl[k]), v2 = ROT(pl[j] - pl[k]);
          O = intersect(m1, v1, m2, v2);
          cl = (pl[i] - O).len2();
          if (check(i, j, k)) ans = max(ans, cl);
        }
  if (ans < 0)
    puts("-1");
  else
    printf("%.8lf\n", sqrt(ans));
  return 0;
}
