#include <bits/stdc++.h>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
int n, dp[3503];
int aib[3503][3503];
struct Iris {
int x, y, z;
}v[3503];
inline int cmp(Iris a, Iris b) { return a.x < b.x; }
inline void update(int x, int y, int val) {
for(int i=x; i<=n; i+=(i&(-i)))
for(int j=y; j<=n; j+=(j&(-j))) aib[i][j] = max(aib[i][j], val);
}
inline int query(int x, int y) {
int rez = 0;
for(int i=x; i>=1; i-=(i&(-i)))
for(int j=y; j>=1; j-=(j&(-j))) rez = max(rez, aib[i][j]);
return rez;
}
int main()
{
int tt; fin >> n >> tt;
while(tt--) {
for(int i=1; i<=n; i++) {
dp[i] = 0;
fin >> v[i].x >> v[i].y >> v[i].z;
for(int j=1; j<=n; j++) aib[i][j] = 0;
}
sort(v+1, v+n+1, cmp);
int rez = 0;
for(int i=1; i<=n; i++) {
int j = i;
while(v[i].x == v[j].x) j++;
for(int k=i; k<j; k++) dp[k] = 1 + query(v[k].y - 1, v[k].z - 1); //prelucrez pe toate cu v[i].x folosind x < v[i].x
for(int k=i; k<j; k++) {
update(v[k].y, v[k].z, dp[k]); //actualizez pt x > v[i].x
rez = max(rez, dp[k]);
}
i = j - 1;
}
fout << rez << '\n';
}
return 0;
}
///ma asigur de x1<x2 si caut cu aib y1<y2 si z1<z2