#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<bitset>
#include<vector>
#include<unordered_map> 
using namespace std;

typedef long long ll;
typedef unsigned int ui;

ll read() {
	ll x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch))x=x*10+(ch^48),ch=getchar();
	return x*f;
}
void write(ll x) {
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+48);
}
void writes(ll x) {write(x),putchar(' ');}
void Writes(ll x) {write(x),putchar('\n');}

#define mp make_pair
#define pb push_back
#define N 3030

int n;
int A[N];

int main() {
	n=read();
	A[1]=2*89,A[2]=3*5*7*89;
	for(int i=1,j=3;i<=10000 and j<=1100;++i) {
		if(i%89 != 0 and i%7 != 0 and i%5 !=0 and i%3 == 0 and i%2 == 0)
			A[j++]=i;
	}
	for(int i=1,j=1101;i<=10000 and j<=1900;++i) {
		if(i%89 != 0 and i%7 != 0 and i%5 == 0 and i%2 == 0)
			A[j++]=i;
	}
	for(int i=1,j=1901;i<=10000 and j<=2500;++i) {
		if(i%89 != 0 and i%7 == 0 and i%2 == 0)
			A[j++]=i;
	}
	for(int i=1;i<=n;++i)
		writes(A[i]);
	
	return 0;
}












#include <stdio.h>
#include <algorithm>
#include <assert.h>
#include <cmath>
#include <deque>
#include <iostream>
#include <limits.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <functional>
#include <iomanip>
#define ll long long
#define rep2(i,a,b) for(int i=a;i<=b;++i)
#define rep(i,n) for(int i=0;i<n;i++)
#define rep3(i,a,b) for(int i=a;i>=b;i--)
#define REP(e,v) for(auto e:v)
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mp make_pair
#define mt make_tuple
#define pq priority_queue<int>
#define pqg priority_queue<int,vector<int>,greater<int>>
#define pb push_back
#define vec vector<int>
#define vecvec vector<vec>
#define vecll vector<ll>
#define vecpii vector<pii>
#define vecpll vector<pll>
#define vecbl vector<bool>
#define endl "\n"
#define ALL(c) (c).begin(),(c).end()
using namespace std;
int in() {int x;scanf("%d",&x);return x;}
ll lin() {ll x;scanf("%lld",&x);return x;}
string stin(){string s;cin>>s;return s;}

double len(double a,double b,double c, double d){
    return sqrt((a-c)*(a-c) + (b-d)*(b-d));
}

 struct UnionFindTree{
    vec par,size,rank,height;//par[i]:iの親,size[i]:iの属する木の要素数,rank[i]:iが、自分の属する木の何階層目にあるか,height[i]:iを根とする部分木の高さ
    int setNum;//木が何本あるか
    UnionFindTree(int n):par(n),size(n),rank(n),height(n){
        rep(i,n){
            par[i]=i;
            size[i]=1;
            rank[i]=-1;
            height[i]=1;
        }
        setNum=n;
    }
    int root(int x){
        if(par[x]==x)return x;
        return root(par[x]);
    }
    void unite(int x, int y){
        int rx=root(x);
        int ry=root(y);
        if(rx==ry)return;
        if(height[rx]<height[ry]){
            par[rx]=ry;
            size[ry]+=size[rx];
        }else{
            par[ry]=rx;
            size[rx]+=size[ry];
            if(height[rx]==height[y]) height[rx]++;
        }
        setNum--;
    }
    bool same(int x, int y){
        return root(x)==root(y);
    }
    int getSize(int x){//xの属する木の要素数
        return size[root(x)];
    }
    int getSetNum(){//木の本数
        return setNum;
    }
    int getRank(int x){//xが何階層目にあるか
         if(par[x]==x)return 0;
         return getRank(par[x])+1;
    }
    int getHeight(int x){//xの属する木の高さ
         return height[root(x)];
    }
};
 

int main(){
    int n=in();
    vector<double> x(n),y(n);
    rep(i,n){
        x[i]=in()*1.0;
        y[i]=in()*1.0;
    }
    
    UnionFindTree tree(n+2);
    vector<pair<double,pii>> v;
    double ans=100.0;
    rep(i,n){
        v.pb(mp(50.0-y[i]/2,mp(i,n)));
        v.pb(mp(y[i]/2+50.0,mp(i,n+1)));
        rep(j,n)if(i!=j){
            v.pb(mp(len(x[i],y[i],x[j],y[j])*1.0/2,mp(i,j)));
        }
    }
    sort(ALL(v));
    REP(e,v){
        int a = e.second.first,b = e.second.second;
        tree.unite(a,b);
        if(tree.same(n,n+1)){
            cout << fixed << setprecision(10) << e.first << endl;
            return 0;
        }
    }
}