#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
#define islld 1
const double INF = 1e9;
const double EPS = 1e-5;
const double PI = acos(-1);
template<class T>
class Point
{
public:
union
{
struct
{
T x,y;
};
T data[2];
};
Point():x(0),y(0){}
Point(T x,T y):x(x),y(y)
{
}
Point(T s):x(s),y(s){}
template<typename T1>
Point(const Point<T1>& p):x(p.x),y(p.y){}
void readInt32(){
scanf("%d%d",&x,&y);
}
void readInt64(){
#if islld
scanf("%lld%lld",&x,&y);
#else
scanf("%I64d%I64d",&x,&y);
#endif
}
void readfloat(){
scanf("%f%f",&x,&y);
}
void readLongDouble(){
scanf("%Lf%Lf",&x,&y);
}
void readDouble(){
scanf("%lf%lf",&x,&y);
}
template<typename T1>
bool operator==(const Point<T1>& rhs)
{
auto v = *this-rhs;
return fabs(v.x) <= EPS && fabs(v.y) <= EPS;
}
inline friend Point operator+(const Point& lhs, const Point& rhs) { return Point(lhs.x+rhs.x,lhs.y+rhs.y); }
inline friend Point operator-(const Point& lhs, const Point& rhs) { return Point(lhs.x-rhs.x,lhs.y-rhs.y); }
inline friend Point operator*(const Point& lhs, const Point& rhs) { return Point(lhs.x*rhs.x,lhs.y*rhs.y); }
inline friend Point operator/(const Point& lhs, const Point& rhs) { return Point(lhs.x/rhs.x,lhs.y/rhs.y); }
};
template<typename T>
inline T cross(const Point<T>& v1,const Point<T>& v2)
{
return v1.x*v2.y-v1.y*v2.x;
}
template<typename T>
inline T dot(const Point<T>& v1,const Point<T>& v2)
{
return v1.x*v2.x+v1.y*v2.y;
}
template<typename T>
inline T sqlen(const Point<T>& p)
{
return p.x*p.x+p.y*p.y;
}
template<typename T>
struct cmp_x {
bool operator()(const Point<T> & a, const Point<T> & b) {
return a.x < b.x || a.x == b.x && a.y < b.y;
}
};
template<typename T>
struct cmp_y {
bool operator()(const Point<T> & a, const Point<T> & b)const {
return a.y < b.y || a.y == b.y && a.x < b.x ;
}
};
template<typename T>
pair<pair<Point<T>,Point<T>>,T> closest_pair(vector<Point<T>> & points)
{
T d = INF;
T ds = INF;
Point<T> p1,p2;
sort(points.begin(),points.end(),cmp_x<T>());
set<Point<T>, cmp_y<T> > w;
int j=0;
for(int i=0;i<points.size();i++){
while(j<i&& points[i].x-points[j].x >ds)
w.erase(w.find(points[j++]));
auto it = w.lower_bound(Point<ll>(-INF,points[i].y-ds));
for(;it!= w.end() && it->y < points[i].y+ds;it++){
if(d > sqlen(points[i]-*it)){
d =sqlen(points[i]-*it);
ds = sqrt(d)+1;
p1 = points[i];
p2 = *it;
}
}
w.insert(points[i]);
}
return make_pair(make_pair(p1,p2),d);
}
int main()
{
int n;
vector<Point<double>> ps;
//freopen("input.txt","r",stdin);
while(true)
{
scanf("%d",&n);
if(n==0)
break;
ps.clear();
ps.reserve(n);
for(int i=0;i<n;i++)
{
Point<double> p;p.readDouble();
ps.push_back(p);
}
double d = closest_pair<double>(ps).second;
double ans = sqrt((double)d);
if(ans+EPS >= 10000.0)
puts("INFINITY");
else
printf("%.4f\n",ans);
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnR5cGVkZWYgbG9uZyBsb25nICBsbDsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpc2xsZCAxCmNvbnN0IGRvdWJsZSBJTkYgPSAxZTk7CmNvbnN0IGRvdWJsZSBFUFMgPSAxZS01Owpjb25zdCBkb3VibGUgUEkgPSBhY29zKC0xKTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFBvaW50CnsKcHVibGljOgogICAgdW5pb24KICAgIHsKICAgICAgICBzdHJ1Y3QKICAgICAgICB7CiAgICAgICAgICAgIFQgeCx5OwogICAgICAgIH07CiAgICAgICAgVCBkYXRhWzJdOwogICAgfTsKICAgIFBvaW50KCk6eCgwKSx5KDApe30KICAgIFBvaW50KFQgeCxUIHkpOngoeCkseSh5KQogICAgewoKICAgIH0KICAgIFBvaW50KFQgcyk6eChzKSx5KHMpe30KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxPgogICAgUG9pbnQoY29uc3QgUG9pbnQ8VDE+JiBwKTp4KHAueCkseShwLnkpe30KCiAgICB2b2lkIHJlYWRJbnQzMigpewogICAgICAgIHNjYW5mKCIlZCVkIiwmeCwmeSk7CiAgICB9CiAgICB2b2lkIHJlYWRJbnQ2NCgpewojaWYgaXNsbGQKICAgICAgICBzY2FuZigiJWxsZCVsbGQiLCZ4LCZ5KTsKI2Vsc2UKICAgICAgICBzY2FuZigiJUk2NGQlSTY0ZCIsJngsJnkpOwojZW5kaWYKICAgIH0KICAgIHZvaWQgcmVhZGZsb2F0KCl7CiAgICAgICAgc2NhbmYoIiVmJWYiLCZ4LCZ5KTsKICAgIH0KICAgIHZvaWQgcmVhZExvbmdEb3VibGUoKXsKICAgICAgICBzY2FuZigiJUxmJUxmIiwmeCwmeSk7CiAgICB9CiAgICB2b2lkIHJlYWREb3VibGUoKXsKICAgICAgICBzY2FuZigiJWxmJWxmIiwmeCwmeSk7CiAgICB9CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMT4KICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQb2ludDxUMT4mIHJocykKICAgIHsKICAgICAgICBhdXRvIHYgPSAqdGhpcy1yaHM7CiAgICAgICAgcmV0dXJuIGZhYnModi54KSA8PSBFUFMgJiYgZmFicyh2LnkpIDw9IEVQUzsKICAgIH0KICAgIGlubGluZSBmcmllbmQgUG9pbnQgb3BlcmF0b3IrKGNvbnN0IFBvaW50JiBsaHMsIGNvbnN0IFBvaW50JiByaHMpIHsgcmV0dXJuIFBvaW50KGxocy54K3Jocy54LGxocy55K3Jocy55KTsgfQogICAgaW5saW5lIGZyaWVuZCBQb2ludCBvcGVyYXRvci0oY29uc3QgUG9pbnQmIGxocywgY29uc3QgUG9pbnQmIHJocykgeyByZXR1cm4gUG9pbnQobGhzLngtcmhzLngsbGhzLnktcmhzLnkpOyB9CiAgICBpbmxpbmUgZnJpZW5kIFBvaW50IG9wZXJhdG9yKihjb25zdCBQb2ludCYgbGhzLCBjb25zdCBQb2ludCYgcmhzKSB7IHJldHVybiBQb2ludChsaHMueCpyaHMueCxsaHMueSpyaHMueSk7IH0KICAgIGlubGluZSBmcmllbmQgUG9pbnQgb3BlcmF0b3IvKGNvbnN0IFBvaW50JiBsaHMsIGNvbnN0IFBvaW50JiByaHMpIHsgcmV0dXJuIFBvaW50KGxocy54L3Jocy54LGxocy55L3Jocy55KTsgfQp9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgppbmxpbmUgVCBjcm9zcyhjb25zdCBQb2ludDxUPiYgdjEsY29uc3QgUG9pbnQ8VD4mIHYyKQp7CiAgICByZXR1cm4gdjEueCp2Mi55LXYxLnkqdjIueDsKfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgppbmxpbmUgVCBkb3QoY29uc3QgUG9pbnQ8VD4mIHYxLGNvbnN0IFBvaW50PFQ+JiB2MikKewogICAgcmV0dXJuIHYxLngqdjIueCt2MS55KnYyLnk7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgVD4KaW5saW5lIFQgc3FsZW4oY29uc3QgUG9pbnQ8VD4mIHApCnsKICAgIHJldHVybiBwLngqcC54K3AueSpwLnk7Cn0KdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGNtcF94IHsKICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQb2ludDxUPiAmIGEsIGNvbnN0IFBvaW50PFQ+ICYgYikgewogICAgICAgIHJldHVybiBhLnggPCBiLnggfHwgYS54ID09IGIueCAmJiBhLnkgPCBiLnk7CiAgICB9Cn07CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBjbXBfeSB7CiAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgUG9pbnQ8VD4gJiBhLCBjb25zdCBQb2ludDxUPiAmIGIpY29uc3QgewogICAgICAgIHJldHVybiBhLnkgPCBiLnkgfHwgYS55ID09IGIueSAmJiBhLnggPCBiLnggOwogICAgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KcGFpcjxwYWlyPFBvaW50PFQ+LFBvaW50PFQ+PixUPiBjbG9zZXN0X3BhaXIodmVjdG9yPFBvaW50PFQ+PiAmIHBvaW50cykKewogICAgVCBkID0gSU5GOwogICAgVCBkcyA9IElORjsKICAgIFBvaW50PFQ+IHAxLHAyOwogICAgc29ydChwb2ludHMuYmVnaW4oKSxwb2ludHMuZW5kKCksY21wX3g8VD4oKSk7CiAgICBzZXQ8UG9pbnQ8VD4sIGNtcF95PFQ+ID4gdzsKICAgIGludCBqPTA7CiAgICBmb3IoaW50IGk9MDtpPHBvaW50cy5zaXplKCk7aSsrKXsKICAgICAgICB3aGlsZShqPGkmJiBwb2ludHNbaV0ueC1wb2ludHNbal0ueCA+ZHMpCiAgICAgICAgICAgIHcuZXJhc2Uody5maW5kKHBvaW50c1tqKytdKSk7CiAgICAgICAgYXV0byBpdCA9IHcubG93ZXJfYm91bmQoUG9pbnQ8bGw+KC1JTkYscG9pbnRzW2ldLnktZHMpKTsKICAgICAgICBmb3IoO2l0IT0gdy5lbmQoKSAmJiBpdC0+eSA8IHBvaW50c1tpXS55K2RzO2l0KyspewogICAgICAgICAgICBpZihkID4gc3FsZW4ocG9pbnRzW2ldLSppdCkpewogICAgICAgICAgICAgICAgZCA9c3FsZW4ocG9pbnRzW2ldLSppdCk7CiAgICAgICAgICAgICAgICBkcyA9IHNxcnQoZCkrMTsKICAgICAgICAgICAgICAgIHAxID0gcG9pbnRzW2ldOwogICAgICAgICAgICAgICAgcDIgPSAqaXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdy5pbnNlcnQocG9pbnRzW2ldKTsKICAgIH0KICAgIHJldHVybiBtYWtlX3BhaXIobWFrZV9wYWlyKHAxLHAyKSxkKTsKfQoKaW50IG1haW4oKQp7CiAgIGludCBuOwogICB2ZWN0b3I8UG9pbnQ8ZG91YmxlPj4gcHM7CiAgIC8vZnJlb3BlbigiaW5wdXQudHh0IiwiciIsc3RkaW4pOwogICB3aGlsZSh0cnVlKQogICB7CiAgICAgICBzY2FuZigiJWQiLCZuKTsKICAgICAgIGlmKG49PTApCiAgICAgICAgYnJlYWs7CiAgICAgICBwcy5jbGVhcigpOwogICAgICAgcHMucmVzZXJ2ZShuKTsKICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICAgICB7CiAgICAgICAgICAgUG9pbnQ8ZG91YmxlPiBwO3AucmVhZERvdWJsZSgpOwogICAgICAgICAgIHBzLnB1c2hfYmFjayhwKTsKICAgICAgIH0KICAgICAgIGRvdWJsZSBkID0gY2xvc2VzdF9wYWlyPGRvdWJsZT4ocHMpLnNlY29uZDsKICAgICAgIGRvdWJsZSBhbnMgPSBzcXJ0KChkb3VibGUpZCk7CiAgICAgICBpZihhbnMrRVBTID49IDEwMDAwLjApCiAgICAgICAgcHV0cygiSU5GSU5JVFkiKTsKICAgICAgIGVsc2UKICAgICAgICBwcmludGYoIiUuNGZcbiIsYW5zKTsKICAgfQogICByZXR1cm4gMDsKfQo=