#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define M 20100
#define INF 10000
typedef struct NN{
double x;
double y;
}NN;
NN *ptr;
NN q[M];
NN vec[M];
int cmpy(const void *_a,const void *_b)
{
NN *a = (NN *)_a;
NN *b = (NN *)_b;
if(a->y != b->y)
return a->y > b->y;
else
return a->x > b->x;
}
int cmpx(const void *_a,const void *_b)
{
NN *a = (NN *)_a;
NN *b = (NN *)_b;
if(a->x != b->x)
return a->x > b->x;
else
return a->y > b->y;
}
double cal(NN Y[],int a,int b)
{
double dx,dy;
dx = Y[a].x - Y[b].x;
dy = Y[a].y - Y[b].y;
return (double)sqrt(dx*dx+dy*dy);
}
double Find_Min(int l,int r)
{
if(l == r ) return INF + 100;
if(l == r -1) return cal(q,l,r);
double temp1 = Find_Min(l,(l+r)>>1);
double temp2 = Find_Min(((l+r)>>1)+1,r);
double mid = q[(l+r)>>1].x,min,temp;
min = temp1 < temp2 ? temp1 : temp2;
int cnt = 0;
for(int i = l;i <= r;i++)
if(fabs(q[i].x - mid) <= min){
vec[cnt].x = q[i].x; vec[cnt].y = q[i].y; cnt++;
}
qsort(vec,cnt,sizeof(vec[0]),cmpy);
for(int i = 0;i < cnt-1;i++)
for(int j = i+1; j < cnt;j++) { // 可以改为 j <= 7 && j < cnt 书上写的但不明白
temp = cal(vec,i,j);
if(temp < min) min = temp;
}
return min;
}
int main()
{
//freopen("in.in","r",stdin);
int n,i,j;
double temp;
while(scanf("%d",&n) == 1 && n)
{
for(i = 0;i < n;i++)
scanf("%lf%lf",&q[i].x,&q[i].y);
qsort(q,n,sizeof(q[0]),cmpx);
temp = Find_Min(0,n-1);
if(temp < 10000)
printf("%.4lf\n",temp);
else
printf("INFINITY\n");
}
return 0;
}