#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int,int> pii;
#define rep(i,x,y) for(int i=x;i<y;i++)
#define rept(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define de(x) cout<< #x<<" = "<<x<<"\n"
#define dd(x) cout<< #x<<" = "<<x<<" "
#define debug() cout<<"I love Miyamizu Mitsuha forever!\n"
#define mes(a,b) memset(a,b,sizeof a)
const int inf=0x3f3f3f3f;
const int maxn=305;
const double eps=1e-8;
pii p[maxn];
int n;
double d(int x1,int y1,int x2,int y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

class ss
{
	public:
		int id1,id2;
		double d;
}dis[1000005];
bool comp(ss s1,ss s2)
{
	return s1.d<s2.d;
}
int f[maxn];
bool vis1[maxn],vis2[maxn];
int find_father(int x)
{
	if(f[x]==x) return x;
	else return f[x]=find_father(f[x]);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	rep(i,0,n) cin>>p[i].fi>>p[i].se;
	int cnt=0;
	rep(i,0,n)
	{
		p[i+n].fi=p[i+2*n].fi=p[i].fi;
		p[i+n].se=100;
		p[i+2*n].se=-100;
		vis1[i+n]=1;
		vis2[i+2*n]=1;
	}
	rep(i,0,3*n)
	{
		rep(j,i+1,3*n)
		{
			dis[cnt].id1=i;
			dis[cnt].id2=j;
			dis[cnt].d=d(p[i].fi,p[i].se,p[j].fi,p[j].se);
			cnt++;
		}
	}
	sort(dis,dis+cnt,comp);
	rep(i,0,3*n) f[i]=i;
	rep(i,0,cnt)
	{
		int fa=find_father(dis[i].id1),fb=find_father(dis[i].id2);
		f[fa]=fb;
		vis2[fb]|=vis2[fa];
		vis1[fb]|=vis1[fa];
		if(vis2[fb]&&vis1[fb])
		{
			cout<<fixed<<setprecision(15)<<dis[i].d/2<<"\n";
			return 0;
		}
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using vb = vector<bool>;
using vl = vector<long>;
using vs = vector<string>;
using vvi = vector<vector<int>>;
using vvb = vector<vector<bool>>;
using vvc = vector<vector<char>>;
using vvl = vector<vector<long>>;
using pii = pair<int, int>;
using pil = pair<int, long>;
using pll = pair<long, long>;
#define fix20 cout << fixed << setprecision(20)
#define YES cout << "Yes" << endl
#define NO cout << "No" << endl
#define rep(i,n) for(long i=0; i<(long)(n);i++)
#define REP(i,s,t) for(long i=s; i<t; i++)
#define RNG(i,s,t,u) for(long i=s; i<t; i+=u)
#define MOD 1000000007
#define all(vec) vec.begin(), vec.end()
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }

vector<long> par;

void Initpar(long n){
  par = vector<long>(n); 
  for(long i=0; i<n; i++) par.at(i) = i;
}

long root(long x){
  if(x == par.at(x)) return x;
  else return par.at(x) = root(par.at(x));
}

void unite(long x, long y){
  long rx = root(x);
  long ry = root(y);
  if(rx == ry) return ;
  if(rx < ry) par.at(ry) = rx;
  else par.at(rx) = ry;
}

bool same(long x, long y){
  return root(x) == root(y);
}

void update_par(){
  for(int i=0;i<par.size();i++){
    root(i);
  }
}

struct Edge
{
  double cost;
  long from;
  long to;
  bool operator<(const Edge& o) const {
    return cost < o.cost;
  }
};

// long root(long x, vector<long> &par){
//   if(x == par.at(x)) return x;
//   else par.at(x) = root(par.at(x), par);
// }

// bool unite(long x, long y, vector<long> &par){
//   long rx = root(x, par);
//   long ry = root(y, par);
//   if(rx == ry) return true;
//   else if(rx < ry) par.at(ry) = rx;
//   else par.at(rx) = ry;
//   return false;
// }

// bool same(long x, long y, vector<long> &par){
//   return root(x,par) == root(y,par);
// }


int main(){
  long n;
  cin >> n;
  vector<pair<long,long>> d(n);
  rep(i,n) cin >> d.at(i).first >> d.at(i).second;
  vector<Edge> list;
  rep(i,n){
    double x = (double)d.at(i).first;
    double y = (double)d.at(i).second;
    REP(j,i+1,n){
      double nx = (double)d.at(j).first;
      double ny = (double)d.at(j).second;
      double r = sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y))/2.0;
      list.push_back(Edge{r,i,j});
    }
  }
  rep(i,n){
    double y = (double)d.at(i).second;
    list.push_back(Edge{(100-y)/2.0,i,n});
    list.push_back(Edge{(y+100)/2.0,i,n+1});
  }
  list.push_back(Edge{100, n, n+1});
  sort(list.begin(), list.end());
  Initpar(n+2);
  rep(i,n+2) par.at(i) = i;
  for(Edge ed : list){
    long s = ed.from;
    long t = ed.to;
    double r = ed.cost;
    unite(s,t);
    if(same(n,n+1)){
      cout << r << endl;
      return 0;
    }
  }
}