#include<cstdio>
#include<algorithm>
using namespace std;
struct cutie{int x,y,z;};
cutie v[3600];
int aib[3510][3510],n;
bool cmp(cutie a,cutie b){
return a.x>b.x;
}
int maxim(int a,int b){
if(a<b)
return b;
return a;
}
int lsb(int x){
return x&(-x);
}
void update(int y,int z,int value){
int i,j;
for(i=y;i>0;i-=lsb(i))
for(j=z;j>0;j-=lsb(j))
aib[i][j]=maxim(aib[i][j],value);
}
int query(int y,int z){
int answer=0,i,j;
for(i=y;i<=n;i+=lsb(i))
for(j=z;j<=n;j+=lsb(j))
answer=maxim(answer,aib[i][j]);
return answer;
}
void reset(int y,int z){
int i,j;
for(i=y;i>0;i-=lsb(i))
for(j=z;j>0;j-=lsb(j))
aib[i][j]=0;
}
int main(){
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
int t,q,i,j,answer,value;
scanf("%d%d",&n,&t);
for(q=1;q<=t;q++){
for(i=1;i<=n;i++)
scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
sort(v+1,v+n+1,cmp);
answer=1;
update(v[1].y,v[1].z,1);
for(i=2;i<=n;i++){
value=query(v[i].y,v[i].z)+1;
answer=maxim(answer,value);
update(v[i].y,v[i].z,value);
}
for(i=1;i<=n;i++)
reset(v[i].y,v[i].z);
printf("%d\n",answer);
}
return 0;
}