/*Coded by::
    **Avinash Tiwary**
    **BE/10298/2015**
    **Production Engineer**
    **Producing <code>**
*/
#include<bits/stdc++.h>
#define buf ios_base::sync_with_stdio (0), cin.tie (0)
typedef long long ll;
typedef double dob;
#define MAX 50010
#define M5 509
#define M6 2000009
#define M 1000000007
#define inf LLONG_MAX
using namespace std;
typedef vector<ll> V;
typedef queue<ll > Q;
typedef stack<ll> S;
typedef pair<ll,ll> P;
#define F first
#define S second
#define mp make_pair
#define mt make_tuple
#define pb push_back
struct point{
    ll x,y,id;
};
bool compx(point a, point b)  {
    return a.x < b.x;
}
bool comp(point a, point b) {
    if(a.y!=b.y)return a.y < b.y;
    return a.x < b.x;
}
ll dis(point a,point b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
ll best_distance,a1,a2;
void merge(point *a,point *aux,ll lo,ll mid,ll hi){
    for(ll i=lo;i<=hi;i++) aux[i]=a[i];
    ll i=lo,j=mid+1,k=lo;
    while(i<=mid&&j<=hi){
        if(comp(aux[i],aux[j])){
            a[k++]=aux[i++];
        }
        else a[k++]=aux[j++]; 
    }
    while(i<=mid) a[k++]=aux[i++];
    //while(j<=hi) a[k++]=aux[j++];
}
ll clop(point *px,point *py,point *aux,ll lo,ll hi){
    if(hi<=lo) return inf;
    ll mid=lo+(hi-lo)/2;
    ll d1=clop(px,py,aux,lo,mid);
    ll d2=clop(px,py,aux,mid+1,hi);
    d1=min(d1,d2);
    merge(py,aux,lo,mid,hi);
    ll j=0;
    for(ll i=lo;i<=hi;i++){
        if(abs(py[i].x-px[mid].x)<d1) aux[j++]=py[i];
    }
    for(ll i=0;i<j-1;i++){
        for(ll k=i+1;k<j&&aux[k].y-aux[i].y<d1;k++){
            if(dis(aux[i],aux[k])<d1){
                d1=dis(aux[i],aux[k]);
                if(d1<best_distance){
                    best_distance=d1;
                    a1=min(aux[i].id,aux[k].id);
                    a2=max(aux[i].id,aux[k].id);
                }
            }
        }
    }
    return d1;
}
int main(){
    buf; 
    //sieve(); 
    //fact();
    ll i,j,k,test,flag,ans,t,n,m,a,b,c; string s1;
    //cin>>test;
    //test=1;
    t=1;
    while(t){
        cin>>n;
        if(n==0) break;
        point *px,*py,*aux;
        px= new point[n];
        for(i=0;i<n;i++) {cin>>px[i].x>>px[i].y; px[i].id=i;}
        py= new point[n];
        sort(px,px+n,compx);
        for(i=0;i<n;i++) py[i]=px[i];
        best_distance=inf;
        aux= new point[n];
        clop(px,py,aux,0,n-1);
        if(best_distance>=100000000) cout<<"INFINITY\n";
        else cout<<fixed<<setprecision(4)<<sqrt(best_distance*1.0)<<"\n";
        delete(px); delete(py); delete(aux);
        t++;
    }
    return 0;
} 