#include <bits/stdc++.h>
using namespace std;
ifstream fin ("cutii.in");
ofstream fout ("cutii.out");
int const lmax=35e2+7;
int n,t;
int aib[lmax][lmax];
int dp[lmax];
struct elem{
int x,y,z;
}v[lmax];
bool cmp(elem a, elem b)
{
return a.x<b.x;
}
void update(int posx, int posy, int val)
{
for(int i=posx;i<=n;i+=(i&-i))
{
for(int j=posy;j<=n;j+=(j&-j))
{
aib[i][j]=max(aib[i][j],val);
}
}
}
int query(int posx, int posy)
{
int s=0;
for(int i=posx;i>0;i-=(i&-i))
{
for(int j=posy;j>0;j-=(j&-j))
{
s=max(s,aib[i][j]);
}
}
return s;
}
void init()
{
for(int i=1;i<=n;i++)
{
v[i].x=v[i].y=v[i].z=0;
dp[i]=0;
}
memset(aib,0,sizeof(aib));///magie neagra
}
int main()
{
fin>>n>>t;
for(int hams=0;hams<t;hams++)
{
init();
for(int ter=1;ter<=n;ter++)
{
fin>>v[ter].x>>v[ter].y>>v[ter].z;
}
sort(v+1,v+n+1,cmp);
for(int i=1;i<=n;i++)
{
dp[i]=query(v[i].y-1,v[i].z-1)+1;///adaug cutia in celelalte
update(v[i].y,v[i].z,dp[i]);
}
int s=0;
for(int i=1;i<=n;i++)
{
s=max(s,dp[i]);
}
fout<<s<<'\n';
}
fin.close();
fout.close();
return 0;
}