#include <iostream>
#include <cmath>
#include <cstdlib>
#include <fstream>
#include <cstdlib>
#define Inf 99999;
using namespace std;
class Pair
{
public :
int x, y;
Pair( int cX, int cY );
};
Pair :: Pair( int cX, int cY )
{
x = cX;
y = cY;
}
int compareX ( const void * a, const void * b)
{
return ( ((Pair*)a)->x - ((Pair*)b)->x );
}
double min( double a, double b )
{
return a < b ? a : b;
}
double distance( Pair v[], int i, int j )
{
return sqrt( pow( ( v[ j ].x - v[ i ].x ), 2 ) + pow( ( v[ j ].y - v[ i ].y ), 2 ) );
}
int indexMax( Pair v[], int mid, int high, int d )
{
int i;
for( i = mid; i <= high; i++ )
{
if( abs( v[ i ].x - v[ mid ].x ) > d ) break;
}
return i - 1 ;
}
int indexMin( Pair v[], int mid, int low, int d )
{
int i;
for( i = mid; i >= low; i-- )
{
if( abs( v[ mid ].x - v[ i ].x ) > d ) break;
}
return i + 1 ;
}
double minDistance2D( Pair v[], int low, int high )
{
int mid = ( low + high ) / 2;
if( low == high )
{
return Inf;
}
if( high - low == 1)
{
return distance( v, low, high );
}
double a = minDistance2D( v, low, mid );
double b = minDistance2D( v, mid + 1, high );
return min( a, b );
}
double function( Pair v[], int low, int high )
{
int mid = ( low + high ) / 2;
double d = minDistance2D( v, low, high );
int i = indexMin( v, mid, low, d );
int j = indexMax( v, mid, high, d );
for( int k = i; k <= j; k++ )
{
for( int l = i; l <= j; l++ )
{
if( k != l)
{
d = min( d, distance( v, k, l) );
}
}
}
return d;
}
int main()
{
int num;
ifstream in ( "cmap.in" );
ofstream out ( "cmap.out" );
in >> num;
Pair * vector = ( Pair* ) malloc ( num * sizeof( Pair ) ) ;
for( int i = 0; i < num; i++ )
{
int x;
int y;
in >> x;
in >> y;
vector[ i ] = Pair( x, y );
}
in.close();
qsort( vector, num , sizeof( Pair ), compareX );
out << function( vector, 0 , num - 1 );
out.close();
return 0;
}