#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<map>
#include<ctime>
#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<bitset>
#include<functional>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define REP(i,l,r) for((i)=(l);(i)<=(r);++(i))
#define REP2(i,l,r) for((i)=(l);(i)!=(r);++(i))
#define sqr(x) ((x)*(x))
using namespace std;
typedef long long LL;
typedef double ld;
const int MAX=10000+10;
struct Point
{
int x,y,r;
}d[MAX];
int n;
pair<ld,ld> toWork[MAX];
int check(int Num)
{
const static ld INF=1e5;
ld left=-INF,right=INF;
int i;
REP(i,1,Num)
{
left=max(left,(ld)d[i].x-d[i].r);
right=min(right,(ld)d[i].x+d[i].r);
}
if(left>right)
return 0;
for(int T=20;T--;)
{
ld mid=(left+right)*0.5;
int top=0;
REP(i,1,Num)
{
ld delta= sqrt ( sqr( d[i].r ) - sqr( mid - d[i].x ) );
toWork[top++]=mp(d[i].y-delta,d[i].y+delta);
}
ld ll=-INF,rr=INF;
int l=0,r=0;
REP2(i,0,Num)
{
if(ll<toWork[i].x)
{
ll=toWork[i].x;
l=i;
}
if(rr>toWork[i].y)
{
rr=toWork[i].y;
r=i;
}
}
if(ll<=rr)
return 1;
ld dist=sqrt(sqr(d[l].x-d[r].x)+sqr(d[l].y-d[r].y));
if(dist > d[l].r+d[r].r )
return 0;
ld angle=atan2(d[r].y-d[l].y,d[r].x-d[l].x);
ld the=( sqr(dist)+sqr(d[l].r)-sqr(d[r].r) ) / (2 * dist * d[l].r);
ld nx=d[l].x+cos(angle-the)*d[l].r;
if(nx<=mid)
right=mid;
else left=mid;
}
return 0;
}
int main()
{
int i;
scanf("%d",&n);
REP(i,1,n)
scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].r);
int Left=1,Right=n;
while(Left<Right)
{
int Mid=(Left+Right+1)/2;
if(check(Mid))
Left=Mid;
else Right=Mid-1;
}
if(Left==n)
printf("NIE\n");
else printf("%d\n",Left+1);
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPgojaW5jbHVkZTxjc3RkbGliPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxmc3RyZWFtPgojaW5jbHVkZTxtYXA+CiNpbmNsdWRlPGN0aW1lPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxiaXRzZXQ+CiNpbmNsdWRlPGZ1bmN0aW9uYWw+CiNkZWZpbmUgeCBmaXJzdAojZGVmaW5lIHkgc2Vjb25kCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgUkVQKGksbCxyKSBmb3IoKGkpPShsKTsoaSk8PShyKTsrKyhpKSkKI2RlZmluZSBSRVAyKGksbCxyKSBmb3IoKGkpPShsKTsoaSkhPShyKTsrKyhpKSkKI2RlZmluZSBzcXIoeCkgKCh4KSooeCkpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBMTDsKdHlwZWRlZiBkb3VibGUgbGQ7Cgpjb25zdCBpbnQgTUFYPTEwMDAwKzEwOwoKc3RydWN0IFBvaW50CnsKCWludCB4LHkscjsKfWRbTUFYXTsKCmludCBuOwpwYWlyPGxkLGxkPiB0b1dvcmtbTUFYXTsKCmludCBjaGVjayhpbnQgTnVtKQp7Cgljb25zdCBzdGF0aWMgbGQgSU5GPTFlNTsKCWxkIGxlZnQ9LUlORixyaWdodD1JTkY7CglpbnQgaTsKCVJFUChpLDEsTnVtKQoJewoJCWxlZnQ9bWF4KGxlZnQsKGxkKWRbaV0ueC1kW2ldLnIpOwoJCXJpZ2h0PW1pbihyaWdodCwobGQpZFtpXS54K2RbaV0ucik7Cgl9CglpZihsZWZ0PnJpZ2h0KQoJCXJldHVybiAwOwoJZm9yKGludCBUPTIwO1QtLTspCgl7CgkJbGQgbWlkPShsZWZ0K3JpZ2h0KSowLjU7CgkJaW50IHRvcD0wOwoJCVJFUChpLDEsTnVtKQoJCXsKCQkJbGQgZGVsdGE9IHNxcnQgKCBzcXIoIGRbaV0uciApIC0gc3FyKCBtaWQgLSBkW2ldLnggKSApOwoJCQl0b1dvcmtbdG9wKytdPW1wKGRbaV0ueS1kZWx0YSxkW2ldLnkrZGVsdGEpOwoJCX0KCQlsZCBsbD0tSU5GLHJyPUlORjsKCQlpbnQgbD0wLHI9MDsKCQlSRVAyKGksMCxOdW0pCgkJewoJCQlpZihsbDx0b1dvcmtbaV0ueCkKCQkJewoJCQkJbGw9dG9Xb3JrW2ldLng7CgkJCQlsPWk7CgkJCX0KCQkJaWYocnI+dG9Xb3JrW2ldLnkpCgkJCXsKCQkJCXJyPXRvV29ya1tpXS55OwoJCQkJcj1pOwoJCQl9CgkJfQoJCWlmKGxsPD1ycikKCQkJcmV0dXJuIDE7CgkJbGQgZGlzdD1zcXJ0KHNxcihkW2xdLngtZFtyXS54KStzcXIoZFtsXS55LWRbcl0ueSkpOwoJCWlmKGRpc3QgPiBkW2xdLnIrZFtyXS5yICkKCQkJcmV0dXJuIDA7CgkJbGQgYW5nbGU9YXRhbjIoZFtyXS55LWRbbF0ueSxkW3JdLngtZFtsXS54KTsKCQlsZCB0aGU9KCBzcXIoZGlzdCkrc3FyKGRbbF0uciktc3FyKGRbcl0ucikgKSAvICgyICogZGlzdCAqIGRbbF0ucik7CgkJbGQgbng9ZFtsXS54K2NvcyhhbmdsZS10aGUpKmRbbF0ucjsKCQlpZihueDw9bWlkKQoJCQlyaWdodD1taWQ7CgkJZWxzZSBsZWZ0PW1pZDsKCX0KCXJldHVybiAwOwp9CgppbnQgbWFpbigpCnsKCWludCBpOwoJc2NhbmYoIiVkIiwmbik7CglSRVAoaSwxLG4pCgkJc2NhbmYoIiVkJWQlZCIsJmRbaV0ueCwmZFtpXS55LCZkW2ldLnIpOwoJaW50IExlZnQ9MSxSaWdodD1uOwoJd2hpbGUoTGVmdDxSaWdodCkKCXsKCQlpbnQgTWlkPShMZWZ0K1JpZ2h0KzEpLzI7CgkJaWYoY2hlY2soTWlkKSkKCQkJTGVmdD1NaWQ7CgkJZWxzZSBSaWdodD1NaWQtMTsKCX0KCWlmKExlZnQ9PW4pCgkJcHJpbnRmKCJOSUVcbiIpOwoJZWxzZSBwcmludGYoIiVkXG4iLExlZnQrMSk7CglyZXR1cm4gMDsKfQ==