#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
const double pi = acos(-1.0);
const double eps = 1e-8;
double c[N], a[N * 4];
void init(int lt, int rt, int step) {
  if (lt == rt) {
    a[step] = c[lt];
    return;
  }
  int mid = (lt + rt) / 2;
  init(lt, mid, 2 * step);
  init(mid + 1, rt, 2 * step + 1);
  a[step] = max(a[2 * step], a[2 * step + 1]);
}
double query(int lt, int rt, int step, int L, int R) {
  if (lt == L && rt == R) return a[step];
  int mid = (L + R) / 2;
  if (rt <= mid)
    return query(lt, rt, 2 * step, L, mid);
  else if (lt > mid)
    return query(lt, rt, 2 * step + 1, mid + 1, R);
  else {
    double x = query(lt, mid, 2 * step, L, mid);
    double y = query(mid + 1, rt, 2 * step + 1, mid + 1, R);
    return max(x, y);
  }
}
struct point {
  double x, y;
  void read() { scanf("%lf%lf", &x, &y); }
  point() {}
  point(double x, double y) : x(x), y(y) {}
  friend bool operator<(const point &p, const point &q) { return p.x < q.x; }
} p[N], b[N];
double sqr(double x) { return x * x; }
double dist(point p, point q) { return sqrt(sqr(p.x - q.x) + sqr(p.y - q.y)); }
double get_angle(point p, point q) {
  if (fabs(p.x - q.x) < eps) {
    if (p.y > q.y) return pi / 2;
    return pi * 3 / 2;
  }
  if (fabs(p.y - q.y) < eps) {
    if (p.x < q.x) return pi;
    return 0;
  }
  double angle = atan2(p.y - q.y, p.x - q.x);
  if (angle < 0) angle += 2 * pi;
  return angle;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) p[i].read();
  double ans = 0;
  for (int i = 1; i <= n; i++) {
    int ct = 0;
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      b[++ct] = point(get_angle(p[j], p[i]), dist(p[i], p[j]));
    }
    sort(b + 1, b + ct + 1);
    for (int j = 1; j <= ct; j++) c[j] = b[j].y;
    init(1, ct, 1);
    for (int j = 1; j <= ct; j++) {
      if (b[j].y <= ans) continue;
      int lt = j + 1, rt = ct, mid, x = -1, y = -1;
      while (lt <= rt) {
        mid = (lt + rt) / 2;
        if (b[mid].x - b[j].x >= pi / 3)
          x = mid, rt = mid - 1;
        else
          lt = mid + 1;
      }
      if (x == -1) continue;
      lt = j + 1, rt = ct;
      while (lt <= rt) {
        mid = (lt + rt) / 2;
        if (b[mid].x - b[j].x < pi / 3)
          lt = mid + 1;
        else {
          if (b[mid].x - b[j].x < pi)
            lt = mid + 1, y = mid;
          else if (2 * pi - (b[mid].x - b[j].x) >= pi / 3)
            lt = mid + 1, y = mid;
          else
            rt = mid - 1;
        }
      }
      if (x > y || y == -1) continue;
      double tmp = query(x, y, 1, 1, ct);
      ans = max(ans, min(b[j].y, tmp));
    }
    for (int j = 1; j <= ct; j++) {
      if (b[j].y <= ans) continue;
      int lt = 1, rt = j - 1, mid, x = -1, y = -1;
      while (lt <= rt) {
        mid = (lt + rt) / 2;
        if (b[j].x - b[mid].x >= pi / 3)
          y = mid, lt = mid + 1;
        else
          rt = mid - 1;
      }
      if (y == -1) continue;
      lt = 1, rt = j - 1;
      while (lt <= rt) {
        mid = (lt + rt) / 2;
        if (b[j].x - b[mid].x < pi / 3)
          rt = mid - 1;
        else {
          if (b[j].x - b[mid].x < pi)
            rt = mid - 1, x = mid;
          else if (2 * pi - (b[j].x - b[mid].x) >= pi / 3)
            rt = mid - 1, x = mid;
          else
            lt = mid + 1;
        }
      }
      if (x > y || x == -1) continue;
      double tmp = query(x, y, 1, 1, ct);
      ans = max(ans, min(b[j].y, tmp));
    }
  }
  printf("%.20lf\n", ans / 2.0);
  return 0;
}
