#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
void input (double (*pl)[2],int n)
{
for(int i=0;i<n;i++)
for(int j=0;j<2;j++)
scanf("%lf",(*(pl+i)+j));
}
double A (double Dot[50][2],int n)//找出分割线
{
int Dot1[50];
int mid;
for(int i=0;i<n;i++)
Dot1[i]==Dot[i][0];
sort(Dot1,Dot1+n);
if(n%2==0)
mid=(Dot1[n/2]+Dot1[n/2+1])/2;
if(n%2!=0)
mid=(Dot1[(n+1)/2]+Dot1[(n-1)/2])/2;
return mid;
}
double B(double Dot[50][2],int n,int mid)
{
double smaller[50][2];
double greater[50][2];
double min;
double nearbyRDot[50][2];
double nearbylDot[50][2];
int s=0;
int g=0;
for(int i=0;i<n;i++)
{
if(Dot[i][0]>mid)
greater[g][0]=Dot[i][0],
greater[g][1]=Dot[i][1],
g++;
if(Dot[i][0]<mid)
smaller[s][0]=Dot[i][0],
smaller[s][1]=Dot[i][1],
s++;
}
double minleft=sqrt(pow((smaller[0][0]-smaller[1][0]),2)+pow((smaller[0][1]-smaller[1][1]),2));
double minright=sqrt(pow((greater[0][0]-greater[1][0]),2)+pow((greater[0][1]-greater[1][1]),2));
double distance=0;
for(int i=0;i<s;i++)
for(int j=i+1;j<s;j++)
{
distance=sqrt(pow((smaller[i][0]-smaller[j][0]),2)+pow((smaller[i][1]-smaller[j][1]),2));
if(distance<minleft)
minleft=distance;
}
for(int i=0;i<g;i++)
for(int j=i+1;j<g;j++)
{
distance=sqrt(pow((greater[i][0]-greater[j][0]),2)+pow((greater[i][1]-greater[j][1]),2));
if(distance<minleft)
minright=distance;
}
{if(minright>minleft)
min=minleft;
else min=minright;}
int j=0;
int k=0;
for(int i=0;i<n;i++)
if((abs(Dot[i][0]-mid)<=min)&&(Dot[i][0]>=mid))
nearbyRDot[j][0]=Dot[i][0],
nearbyRDot[j][1]=Dot[i][1],
j++;
else nearbylDot[k][0]=Dot[i][0],
nearbylDot[k][0]=Dot[i][0],
k++;
double P,H;
for(int i=0;i<j;i++)
for(int o=i+1;o<j;o++)
if(nearbyRDot[i][1]>=nearbyRDot[o][1])
P=nearbyRDot[i][1],nearbyRDot[i][1]=nearbyRDot[o][1],nearbyRDot[o][1]=P,
H=nearbyRDot[i][0],nearbyRDot[i][0]=nearbyRDot[o][0],nearbyRDot[o][0]=H;
double min1=sqrt(pow((nearbylDot[1][0]-nearbyRDot[1][0]),2)+pow((nearbylDot[1][1]-nearbyRDot[1][1]),2));;
for(int i=0;i<k;i++)
{
for(int m=0;m<j;m++)
{int l=0;
if(l<4)
if(nearbyRDot[m][1]>nearbylDot[i][1])
distance=sqrt(pow((nearbylDot[i][0]-nearbyRDot[m][0]),2)+pow((nearbylDot[i][1]-nearbyRDot[m][1]),2));
if(distance<min1)
min1=distance;
l++;
}
for(int m=j-1;m>0;m++ )
{
int f=0;
if(f<4)
if(nearbyRDot[m][1]<nearbylDot[i][1])
distance=sqrt(pow((nearbylDot[i][0]-nearbyRDot[f][0]),2)+pow((nearbylDot[i][1]-nearbyRDot[f][1]),2));
if(distance<min1)
min1=distance;
f++;
}
}
if(min1>min) return min;
else return min1;
}
int main()
{
int n;
double Dot[50][2], *pl=Dot[0],mid;
scanf("%d",&n);
input(Dot,n);
mid=A(Dot,n);
printf("%f",B(Dot,n,mid));
}