#include <stdio.h>
#include <stdlib.h>
#define fr(i,a,b) for(int i=a;i<=b;++i)
#define t(i) i^(i&(i-1))
#define max(a,b) a>b?a:b
#define N 3500
struct b{int x,y,z;}a[N+1];
int d[N+1][N+1],t,n,m,M;;
int c(const void*x,const void*y){
return (*(b*)x).x-(*(b*)y).x;
}
void u(int i,int j,int x){
int y=j;
while(i<=n){
j=y;
while(j<=n) d[i][j]=x?max(d[i][j],x):0,j+=t(j);
i+=t(i);
}
}
int q(int i,int j){
int m=0,x=j;
while(i){
j=x;
while(j) m=max(d[i][j],m),j-=t(j);
i-=t(i);
}
return m;
}
int main(){
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%i%i",&n,&t);
fr(y,1,t){
M=0;
fr(i,1,n)scanf("%i%i%i",&a[i].x,&a[i].y,&a[i].z);
qsort(a+1,n,sizeof(b),c);
fr(i,1,n){
m=q(a[i].y-1,a[i].z-1)+1;
M=max(m,M);
u(a[i].y,a[i].z,m);
}
printf("%i\n",M);
fr(i,1,n)u(a[i].y,a[i].z,0);
}
return 0;
}