#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#include <complex>
#include <ctime>
#include <cassert>
#include <functional>

using namespace std;

typedef long long ll;
typedef vector<int> VI;
typedef pair<ll, ll> PLL;

#define REP(i,s,t) for(int i=(s);i<(t);i++)
#define FILL(x,v) memset(x,v,sizeof(x))
#define MAXN 1005

VI adj[MAXN];
int N, R, RB;
int lb, v[MAXN], vlow[MAXN];
bool isArt[MAXN];
void dfs(int x, int pre) {
	vlow[x] = v[x] = ++lb;
	REP(i,0,adj[x].size()){
		int y = adj[x][i];
		if(y==pre) continue;
		if(!v[y]){
			if(x==R) RB++;
			dfs(y, x);
			vlow[x] = min(vlow[x], vlow[y]);
      isArt[x] |= vlow[y] >= v[x];
		}else vlow[x] = min(vlow[x], v[y]);
	}
}
void tarjan(int root) {
	FILL(v, 0); FILL(vlow, 0); FILL(isArt, false); lb = 0; R = root; RB = 0; dfs(root, -1);
}

double dst[MAXN][MAXN];
int main() {
  cin >> N;
  VI x(N+1,0), y(N+1,0);
  REP(i,1,N+1) cin >> x[i] >> y[i];
  N++;
  REP(i,0,N) REP(j,i+1,N) dst[i][j] = dst[j][i] = sqrt((double)(x[i] - x[j]) * (double)(x[i] - x[j]) + (double)(y[i] - y[j]) * (y[i] - y[j]));
  double l = 0, r = 4e9;
  REP(it,0,64) {
    double m = (l + r) / 2;
    REP(i,0,N) adj[i].clear();
    REP(i,0,N) REP(j,i+1,N) if (dst[i][j] <= m) {
      adj[i].push_back(j);
      adj[j].push_back(i);
    }
    tarjan(0);
    bool ok = true;
    REP(i,1,N) {
      if (v[i] == 0 || isArt[i]) ok = false;
    }
    if (ok) r = m;
    else l = m;
  }
  printf("%.9lf\n", l);
  return 0;
}
