#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <algorithm>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define _max(_a_,_b_) ((_a_)>(_b_)?(_a_):(_b_))
#ifdef ONLINE_JUDGE
char __B[1<<15],*__S=__B,*__T=__B;
#define getchar() (__S==__T&&(__T=(__S=__B)+fread(__B,1,1<<15,stdin),__S==__T)?EOF:*__S++)
#endif
inline int getnum()
{
register char c=0;
register bool neg=false;
while(!(c>='0' && c<='9'))
c=getchar(),neg|=(c=='-');
register int a=0;
while(c>='0' && c<='9')
a=a*10+c-'0',c=getchar();
return (neg?-1:1)*a;
}
#pragma pack(1)
struct _event
{
int x,id;
bool ins;
bool operator < (const _event&o)const
{
if(x != o.x)
return x < o.x;
return ins > o.ins;
}
}event[40505];
int le,x[20505],y[20505],r[20505];
int _curx;
struct _node
{
int id;
bool type;
bool operator < (const _node&o)const
{
if(id == o.id)
return type < o.type;
#define _sqr(_x) ((long long)(_x)*(_x))
register long long p=_sqr(r[id])-_sqr(_curx-x[id]);
register long long p1=_sqr(r[o.id])-_sqr(_curx-x[o.id]);
return (type ? 1 : -1)*__builtin_sqrtl(p)+y[id] \
< (o.type ? 1 : -1)*__builtin_sqrtl(p1)+y[o.id];
}
};
typedef __gnu_pbds::tree<_node,__gnu_pbds::null_type> _t;
typedef _t::point_iterator _tit;
_t tree;
_tit itp[40505];
int father[20505];
int gcnt,ghead[20505],gnext[40505],gnode[40505];
inline void insertLine(register int s,register int t)
{
gnext[++gcnt]=ghead[s],ghead[s]=gcnt,gnode[gcnt]=t;
gnext[++gcnt]=ghead[t],ghead[t]=gcnt,gnode[gcnt]=s;
}
int f[20505];
void DFS(register int o,register int fa)
{
f[o]=0;
for(register int j=ghead[o],t;j;j=gnext[j])
if((t=gnode[j]) != fa)
{
DFS(t,o);
f[o]^=(f[t]+1);
}
}
int main()
{
register int _T=getnum();
while(_T--)
{
register int N=getnum();
le=0;
for(register int i=1;i<=N;i++)
{
x[i]=getnum(),y[i]=getnum(),r[i]=getnum();
event[++le].x=x[i]-r[i],event[le].id=i,event[le].ins=true;
event[++le].x=x[i]+r[i],event[le].id=i,event[le].ins=false;
}
std::sort(&event[1],&event[le+1]);
tree.clear(),r[N+1]=INT_MAX>>1;
tree.insert((_node){N+1,1}),tree.insert((_node){N+1,0});
_tit it;
for(register int i=1;i<=le;i++)
{
_curx=event[i].x;
if(event[i].ins)
{
tree.insert((_node){event[i].id,1}).first;
it=tree.insert((_node){event[i].id,0}).first;
if((--it)->type == 0)
father[event[i].id]=it->id;
else
father[event[i].id]=father[it->id];
}
else
{
tree.erase(tree.find((_node){event[i].id,1}));
tree.erase(tree.find((_node){event[i].id,0}));
}
}
gcnt=0,memset(ghead,0,sizeof(ghead));
for(register int i=1;i<=N;i++)
insertLine(i,father[i]);
DFS(N+1,0);
printf("%s\n",(f[N+1] ? "Alice" : "Bob"));
}
return 0;
}