#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
short n,t,val,X,Y;
short arb[3501*3501*2];
short x[3501],y[3501],z[3501],v[3501];
short max (short a, short b)
{
if (a > b)
return a;
return b;
}
void query (short node, short lx, short rx, short ly, short ry)
{
if (rx <= X && ry <= Y)
{
val = max(val,arb[node]);
return;
}
int midx = (lx+rx)/2;
int midy = (ly+ry)/2;
query (node*4-2,lx,midx,ly,midy);
if (X > midx) query (node*4-1,midx+1,rx,ly,midy);
if (Y > midy) query (node*4,lx,midx,midy+1,ry);
if (X > midx && Y > midy) query (node*4+1,midx+1,rx,midy+1,ry);
}
void update (short node, short lx, short rx, short ly, short ry)
{
if (lx == rx)
{
arb[node] = val;
return;
}
int midx = (lx+rx)/2;
int midy = (ly+ry)/2;
int wh;
if (X <= midx && Y <= midy) {update (node*4-2,lx,midx,ly,midy); wh = node*4-2;}
else if (X > midx && Y<= midy) {update (node*4-1,midx+1,rx,ly,midy); wh = node*4-1;}
else if (X <= midx && Y > midy) {update (node*4,lx,midx,midy+1,ry); wh = node*4;}
else {update (node*4+1,midx+1,rx,midy+1,ry); wh= node*4+1;}
arb[node] = max (arb[node],arb[wh]);
}
int main()
{
fin>>n>>t;
for (;t; --t)
{
for (int i=1; i<=n; ++i)
{
fin>>x[i]>>y[i]>>z[i];
v[x[i]] = i;
}
memset (arb,0,sizeof(arb));
for (int i=1; i<=n; ++i)
{
X = y[v[i]]-1; Y = z[v[i]]-1;
val = 0;
if (X!=0 && Y!=0) query (1,1,n,1,n);
val++;
X++; Y++;
update (1,1,n,1,n);
}
X=n; Y=n;
val = 0;
query (1,1,n,1,n);
fout<<val<<"\n";
}
}