#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-6;
inline long long dcmp(long double first) {
  if (fabs(first) < eps)
    return 0;
  else
    return first < 0 ? -1 : 1;
}
struct Point {
  long double first, second;
  Point(long double first = 0, long double second = 0)
      : first(first), second(second) {}
  void read() { cin >> first >> second; }
  void write() { cout << '(' << first << ',' << second << ')' << endl; }
  bool operator==(const Point& u) const {
    return dcmp(first - u.first) == 0 && dcmp(second - u.second) == 0;
  }
  bool operator!=(const Point& u) const { return !(*this == u); }
  bool operator<(const Point& u) const {
    return dcmp(first - u.first) < 0 ||
           (dcmp(first - u.first) == 0 && dcmp(second - u.second) < 0);
  }
  bool operator>(const Point& u) const { return u < *this; }
  bool operator<=(const Point& u) const { return *this < u || *this == u; }
  bool operator>=(const Point& u) const { return *this > u || *this == u; }
  Point operator+(const Point& u) {
    return Point(first + u.first, second + u.second);
  }
  Point operator-(const Point& u) {
    return Point(first - u.first, second - u.second);
  }
  Point operator*(const long double u) { return Point(first * u, second * u); }
  Point operator/(const long double u) { return Point(first / u, second / u); }
  long double operator*(const Point& u) {
    return first * u.second - second * u.first;
  }
};
long double getDistance(Point a, Point b) {
  long double first = a.first - b.first, second = a.second - b.second;
  return (first * first + second * second);
}
long double getDot(Point a, Point b) {
  return a.first * b.first + a.second * b.second;
}
long double getCross(Point a, Point b) {
  return a.first * b.second - a.second * b.first;
}
long double getLength(Point a) { return sqrt(getDot(a, a)); }
long double getPLength(Point a) { return getDot(a, a); }
long double getAngle(Point u) { return atan2(u.second, u.first); }
long double getAngle(Point a, Point b) {
  return acos(getDot(a, b) / getLength(a) / getLength(b));
}
Point rotate(Point a, long double rad) {
  return Point(a.first * cos(rad) - a.second * sin(rad),
               a.first * sin(rad) + a.second * cos(rad));
}
Point getNormal(Point a) {
  long double l = getLength(a);
  return Point(-a.second / l, a.first / l);
}
long long getConvexHull(Point* p, long long n, Point* ch) {
  long long m = 0;
  for (long long i = 0; i < n; i++) {
    while (m > 1 &&
           dcmp(getCross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 1])) <= 0)
      m--;
    ch[m++] = p[i];
  }
  long long k = m;
  for (long long i = n - 2; i >= 0; i--) {
    while (m > k &&
           dcmp(getCross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2])) <= 0)
      m--;
    ch[m++] = p[i];
  }
  if (n > 1) m--;
  return m;
}
long double rotatingCalipers(Point* p, long long n) {
  if (n <= 1) return 0.0;
  long double ans = 0.0;
  long long j = 1;
  p[n] = p[0];
  for (long long i = 0; i < n; i++) {
    while (getCross(p[j + 1] - p[i + 1], p[i] - p[i + 1]) >
           getCross(p[j] - p[i + 1], p[i] - p[i + 1]))
      j = (j + 1) % n;
    ans = max(ans, getDistance(p[i], p[j]));
    ans = max(ans, getDistance(p[i + 1], p[j + 1]));
  }
  return ans;
}
Point pts[3007], tmp[3007], ch[3007];
int main() {
  long long n;
  scanf("%lld", &n);
  for (long long i = (0); i < (n); i++) {
    pts[i].read();
  }
  sort(pts, pts + n);
  long double l = 0, r = 30007;
  while ((r - l) > .000001) {
    long double rr = ((l + r) / 2) * ((l + r) / 2);
    long double d = 0;
    for (long long i = (0); i < (n); i++) {
      long long sz = 0;
      for (long long j = (i + 1); j < (n); j++) {
        if (getDistance(pts[i], pts[j]) >= rr) {
          tmp[sz++] = pts[j];
        }
      }
      sz = getConvexHull(tmp, sz, ch);
      d = max(d, rotatingCalipers(ch, sz));
    }
    if (d >= rr)
      l = ((l + r) / 2);
    else
      r = ((l + r) / 2);
  }
  cout << fixed << setprecision(10) << l / 2 << endl;
}
