#include<bits/stdc++.h>
using namespace std;
const int N=3505;
int aib[N][N];
void update(int lin,int col,int val){
for(int i=lin;i<N;i+= i&(-i)){
for(int j=col;j<N;j+= j&(-j)){
aib[i][j]=max(val,aib[i][j]);
}
}
}
int query(int lin,int col){
int ans=0;
for(int i=lin;i>0; i-= i&(-i)){
for(int j=col;j>0;j-= j&(-j))
ans=max(ans,aib[i][j]);
}
return ans;
}
struct coord{
int x,y,z;
};
bool cmp(coord a,coord b){
return a.z<b.z;
}
coord v[N];
FILE*fin,*fout;
void solve(int n){
memset(aib,0,sizeof(aib));
for(int i=1;i<=n;i++){
fscanf(fin,"%d %d %d",&v[i].x,&v[i].y,&v[i].z);
}
sort(v+1,v+n+1,cmp);
for(int i=1;i<=n;i++){
int best=query(v[i].x,v[i].y);
update(v[i].x,v[i].y,best+1);
}
fprintf(fout,"%d\n",query(n,n));
}
int main()
{
fin=fopen("cutii.in","r");
fout=fopen("cutii.out","w");
int n,nrt;
fscanf(fin,"%d%d",&n,&nrt);
while(nrt--)
solve(n);
return 0;
}