#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <set>
#include <bits/stdc++.h>
using namespace std;
FILE *in = fopen("cutii.in", "r"), *out = fopen("cutii.out", "w");
#define MaxN 3505
int N, T, result;
int BIT[MaxN][MaxN];
struct Box {
int dims[3];
} v[MaxN];
int query(int x, int y){
int ML = 0;
for(int i = x; i > 0; i -= i & (-i))
for(int j = y; j > 0; j -= j & (-j)){
ML = max(ML, BIT[i][j]);
}
return ML;
}
void update(int x, int y, int len){
for(int i = x; i <= N; i += i & (-i))
for(int j = y; j <= N; j += j & (-j)){
BIT[i][j] = max(len, BIT[i][j]);
}
}
int main()
{
fscanf(in, "%d %d", &N, &T);
int ML;
while(T--) {
for(int i = 1; i <= N; ++i)
fscanf(in, "%d %d %d", &v[i].dims[0], &v[i].dims[1], &v[i].dims[2]);
sort(v + 1, v + N + 1, [](Box a, Box b) { return a.dims[0] < b.dims[0]; });
result = 1;
for (int i = 1; i <= N; ++i){
ML = query(v[i].dims[1] - 1, v[i].dims[2] - 1);
update(v[i].dims[1], v[i].dims[2], ML + 1);
if (ML + 1 > result)
result = ML + 1;
}
fprintf(out, "%d\n", result);
memset(BIT, 0, sizeof(BIT));
}
return 0;
}