#include <bits/stdc++.h>
using namespace std;
const int L = 1 << 19;
char ibuf[L], *ie = ibuf + L, *ip = ie - 1;
inline char nc(void) {
  if (++ip == ie)
    if (fread(ip = ibuf, 1, L, stdin))
      ;
  return *ip;
}
inline int read(void) {
  char opt;
  int flag = 1, res = 0;
  while ((opt = nc()) < '0')
    if (opt == '-') flag = -1;
  while (opt >= '0') {
    res = (res << 3) + (res << 1) + opt - '0';
    opt = nc();
  }
  return res * flag;
}
int n, tot;
bitset<3001> vis[3001];
struct Point {
  int x, y;
} p[3001];
struct edge {
  int x, y, len;
  inline char operator<(edge a) const { return len > a.len; }
} q[3001 * 3001 / 2];
signed main(void) {
  int i, j, x, y;
  n = read();
  for (i = 1; i <= n; ++i) p[i] = {read(), read()};
  for (i = 1; i < n; ++i)
    for (j = i + 1; j <= n; ++j)
      q[++tot] = {i, j,
                  (p[i].x - p[j].x) * (p[i].x - p[j].x) +
                      (p[i].y - p[j].y) * (p[i].y - p[j].y)};
  sort(q + 1, q + tot + 1);
  for (i = 1; i <= tot; ++i) {
    if ((vis[x = q[i].x] & vis[y = q[i].y]).any())
      return printf("%.10lf\n", sqrt(q[i].len) / 2.), 0;
    vis[x].set(y), vis[y].set(x);
  }
  return 0;
}
