#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define mp make_pair
FILE *in,*out;
typedef pair<short int,short int> ii;
ii arb[3505][3505];
pair< int,pair< int, int> > a[3550];
int n;
inline ii maxv (ii x,ii y,short int t)
{
if (x.se!=t&&y.se==t)
return y;
if (x.se==t&&y.se!=t)
return x;
return x.fi>y.fi?x:y;
}
inline short int bit(short int x)
{
return (x&(x-1))^x;
}
short int query(short int x,short int y,short int t)
{
short int i,j;
ii rez=mp(0,t);
for (i=x;i>0;i-=bit(i))
for (j=y;j>0;j-=bit(j))
rez=maxv(rez,arb[i][j],t);
return rez.fi;
}
void update(short int x,short int y,short int val,short int t)
{
int i,j;
ii aux=mp(val,t);
for (i=x;i<=n;i+=bit(i))
for (j=y;j<=n;j+=bit(j))
arb[i][j]=maxv(arb[i][j],aux,t);
}
int main()
{
int T,t,i,val;
in=fopen("cutii.in","r");
out=fopen("cutii.out","w");
fscanf(in,"%d%d",&n,&T);
for (t=1;t<=T;t++)
{
for (i=1;i<=n;i++)
fscanf(in,"%d%d%d",&a[i].fi,&a[i].se.fi,&a[i].se.se);
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
{
val=1+query(a[i].se.fi,a[i].se.se,t);
update(a[i].se.fi,a[i].se.se,val,t);
}
fprintf(out,"%d\n",query(n,n,t));
}
fclose(in);
fclose(out);
return 0;
}