#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <algorithm>
#define oo (1<<29)
#define mp make_pair
#define pb push_back
#define sh short int
#define N 3501
using namespace std;
sh n,t;
class cutii{
public:
sh a,b,c;
};
vector<cutii> V;
sh aib[N][N];
inline cutii mc(sh a,sh b,sh c){
return (cutii){a,b,c};
}
inline bool cmp(cutii a,cutii b){
return a.c < b.c;
}
int Sol = 0;
inline sh lsb(sh x){
return (sh)((x^(x-1))&x);
}
void update(sh a,sh b,sh nr){
sh i,j;
for (i = a; i <= n; i += lsb(i))
for (j = b; j <= n; j += lsb(j))
if (nr > aib[i][j])
aib[i][j] = nr;
}
sh query(sh a,sh b){
sh i,j,tmp = 0;
for (i = a; i; i -= lsb(i))
for (j = b; j; j -= lsb(j))
tmp = max(tmp, aib[i][j]);
return tmp;
}
int main(){
int i;
sh a,b,c,Now;
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%hu%hu",&n,&t);
while (t--){
V.clear();
V.push_back(mc(-30000,-30000,-30000));
Sol = 0;
memset(aib,0,sizeof(aib));
for (i = 1; i <= n; ++i){
scanf("%hu%hu%hu",&a,&b,&c);
V.pb(mc(a,b,c));
}
sort(V.begin(),V.end(),cmp);
for (i = 1; i <= n; ++i){
//printf("(%hu %hu %hu ",V[i].a,V[i].b,V[i].c);
Now = query(V[i].a - 1,V[i].b - 1) + 1;
if (Now > Sol)
Sol = Now;
update(V[i].a,V[i].b,Now);
//printf("%d )",Now);
}
printf("%hu\n",Sol);
}
}