#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
struct point
{
double x,y;
};
double Distance(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool X(point a,point b)
{
return a.x<b.x;
}
bool Y(point a,point b)
{
return a.y<b.y;
}
double Min(double a, double b)
{
if(a>b) return b;
else return a;
}
double Closest(point Dot[],int n)
{
double mid;
double min;
sort(Dot,Dot+n,X);
double min1=Distance(Dot[0],Dot[1]);
double min2=Distance(Dot[n-2],Dot[n-1]);
mid=Dot[n/2].x;
for(int i=0;i<mid;i++)
for(int j=i+1;j<mid;j++)
if(Distance(Dot[i],Dot[j])<min1)
min1=Distance(Dot[i],Dot[j]);
for(int i=mid;i<n;i++)
for(int j=i+1;j<n;j++)
if(Distance(Dot[i],Dot[j])<min2)
min2=Distance(Dot[i],Dot[j]);
min= Min(min1,min2);
point Dot1[10];
int g=0;
double min3;
for(int i=0;i<n;i++)
if(abs(Dot[i].x-mid)<min)
Dot1[g++]=Dot[i];
sort(Dot1,Dot1+g,Y);
int l=0;
for(int i=0;i<g;i++)
for(int k=i+1;k<g;k++)
if(l<4)
min3=Min(Distance(Dot1[i],Dot1[k]),min),l++;
else break;
return min3;
}
int main()
{
int n;
scanf("%d",&n);
point Dot[10];
for(int i=0;i<n;i++)
cin>>Dot[i].x>>Dot[i].y;
printf("%f",Closest(Dot,n));
}