#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
#define nm 3502
#define PB push_back
#define MKP make_pair
#define FOR(i,a,b)for(i=(a);i<=(b);++i)
#define Y second.first
#define Z second.second
#define lsb(x)(((x)^(x-1))&x)
int N,T,AIB[nm][nm];
vector<pair<int,pair<int,int> > > E;
inline void update_line(int line,int column,int val)
{
while(column<=N)
{
AIB[line][column]=max(AIB[line][column],val);
column+=lsb(column);
}
}
void update(int line,int column,int val)
{
while(line<=N)
{
update_line(line,column,val);
line+=lsb(line);
}
}
inline void back_update_line(int line,int column)
{
while(column<=N)
{
AIB[line][column]=0;
column+=lsb(column);
}
}
void back_update(int line,int column)
{
while(line<=N)
{
back_update_line(line,column);
line+=lsb(line);
}
}
inline int query_line(int line,int column)
{
int ans=0;
while(column)
{
ans=max(AIB[line][column],ans);
column-=lsb(column);
}
return ans;
}
int query(int line,int column)
{
int ans=0;
while(line)
{
ans=max(query_line(line,column),ans);
line-=lsb(line);
}
return ans;
}
int main()
{
int x,y,z,i,j;
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%d %d",&N,&T);
FOR(i,1,T)
{
int best=0;
E.clear();
FOR(j,1,N)
{
scanf("%d %d %d",&x,&y,&z);
E.PB(MKP(x,MKP(-y,-z)));
}
sort(E.begin(),E.end());
FOR(j,0,N-1)
{
//find out the answer for B[j+1]
y=-E[j].Y;
z=-E[j].Z;
int ansc=query(y-1,z-1)+1;
best=max(ansc,best);
//update the BIT with the current solution
update(y,z,ansc);
}
printf("%d\n",best);
FOR(j,0,N-1)
{
y=-E[j].Y;
z=-E[j].Z;
back_update(y,z);
}
}
return 0;
}