program cutii;
var a:array[1..35000,1..3] of longint;
b:array[1..35000] of longint;
n,i,j,x,y,z,best,max,k,t:longint;
buf:array[1..1 shl 16] of char;
procedure swap(i,j:longint);
var aux:longint;
begin
aux:=a[i,1];
a[i,1]:=a[j,1];
a[j,1]:=aux;
aux:=a[i,2];
a[i,2]:=a[j,2];
a[j,2]:=aux;
aux:=a[i,3];
a[i,3]:=a[j,3];
a[j,3]:=aux;
end;
function int(i,j:longint):boolean;
begin
int:=(a[i,1]<a[j,1]) and (a[i,2]<a[j,2]) and (a[i,3]<a[j,3]);
end;
begin
assign(input,'cutii.in');
assign(output,'cutii.out');
reset(input);
rewrite(output);
settextbuf(input,buf);
readln(n,t);
for k:=1 to t do
begin
for i:=1 to n do
readln(a[i,1],a[i,2],a[i,3]);
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i,1]>a[j,1] then swap(i,j)
else if (a[i,1]=a[j,1])and(a[i,2]>a[j,2])
then swap(i,j)
else if (a[i,1]=a[j,1])and(a[i,2]=a[j,2])and(a[i,3]>a[j,3])
then swap(i,j);
best:=0;
b[1]:=1;
for i:=2 to n do
begin
max:=0;
for j:=1 to i-1 do
if (int(j,i)) then
if b[j]>max then max:=b[j];
b[i]:=max+1;
if b[i]>best then best:=b[i];
end;
writeln(best);
end;
close(output);
end.