#include <bits/stdc++.h>
using namespace std;
#if 1
#define cin fin
#define cout fout
ifstream fin("cutii.in");
ofstream fout("cutii.out");
#endif // 1
int n;
const int nmx = 3505;
typedef array<int,3> C;
vector<C> cut;
bool canFit(C c1, C c2){ // can box c1 fit in box c2 ?
return c1[0] < c2[0] && c1[1] < c2[1] && c1[2] < c2[2];
}
int g[nmx][nmx]; // aciclic
int viz[nmx];
vector<int> tsort;
void dfs(int k){
viz[k] = 1;
for(int i=0;i<n;i++){
if(g[k][i] && viz[i]==0)
dfs(i);
}
tsort.push_back(k);
}
int lch[nmx];
void mdfs(int k){
viz[k] = 1;
for(int i=0;i<n;i++)
if(g[k][i]){
lch[i] = max(lch[i],lch[k] + 1);
if(viz[i]==0){
mdfs(i);
}
}
}
void solve(){
fill(viz,viz+nmx,0);
fill(lch,lch+nmx,0);
tsort.clear();
cut.clear();
for(int i=0;i<n;i++){
C c;
cin >> c[0] >> c[1] >> c[2];
cut.push_back(c);
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i][j] = canFit(cut[j],cut[i]);
for(int i=0;i<n;i++)
if(viz[i]==0)
dfs(i);
reverse(tsort.begin(),tsort.end());
fill(viz,viz+nmx,0);
for(int i=0;i<n;i++){
if(viz[tsort[i]]==0)
mdfs(tsort[i]);
}
int res = 0;
for(int i=0;i<n;i++)
res = max(res,lch[i]);
cout << res+1 << "\n";
}
int main(){
int t;
cin >> n >> t;
while(t--){
solve();
}
}