#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  void scan() { scanf("%d%d", &x, &y); }
} p[3010], tmp[3100];
int dis(point a, point b) {
  int x = a.x - b.x;
  int y = a.y - b.y;
  return (x * x + y * y);
}
struct Node {
  int u, v;
  int d;
  Node() {}
  Node(int d, int u, int v) : d(d), u(u), v(v) {}
} nde[4500007];
bool cmp(Node a, Node b) { return a.d > b.d; }
struct Bit {
  unsigned long long a[50];
  void init() { memset(a, 0, sizeof(a)); }
  void add(int x) { a[x / 64] |= 1uLL << (x & 63); }
} bit[3300];
bool check(Bit a, Bit b) {
  for (int i = 0; i < 50; ++i)
    if (a.a[i] & b.a[i]) return 1;
  return 0;
}
int main() {
  int n, nn = 0;
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    p[i].scan();
    for (int j = 0; j < i; ++j) {
      nde[nn++] = Node(dis(p[i], p[j]), i, j);
    }
  }
  sort(nde, nde + nn, cmp);
  int u, v, d;
  for (int i = 0; i < nn; ++i) {
    u = nde[i].u, v = nde[i].v;
    if (check(bit[u], bit[v])) {
      printf("%.7lf\n", sqrt(nde[i].d + 0.0) / 2);
      return 0;
    }
    bit[u].add(v), bit[v].add(u);
  }
}
