#include <bits/stdc++.h>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
const int MaxN = 3501;
struct seg {
seg() {
d = src = 0;
}
int d, src;
};
struct str { int a, b, c; };
str cutii[MaxN];
seg tree[4 * MaxN];
int v[MaxN], ind[MaxN], k[MaxN], sol[MaxN], in[MaxN];
static inline int lSon(int node) {
return (node << 1);
}
static inline int rSon(int node) {
return (node << 1) + 1;
}
void update(int node, int st, int dr, int i, int val, int s) {
int mij = (st + dr) / 2;
if (st == dr) {
tree[node].d = val;
tree[node].src = s;
return;
}
if (i <= mij) {
update(lSon(node), st, mij, i, val, s);
}
else {
update(rSon(node), mij + 1, dr, i, val, s);
}
if (tree[lSon(node)].d > tree[rSon(node)].d) {
tree[node].d = tree[lSon(node)].d;
tree[node].src = tree[lSon(node)].src;
}
else {
tree[node].d = tree[rSon(node)].d;
tree[node].src = tree[rSon(node)].src;
}
}
int qi = 0;
seg query(int node, int st, int dr, int x, int y) {
int mij = (st + dr) / 2;
seg l, r;
if (x <= st && dr <= y) {
return tree[node];
}
if (x <= mij) {
l = query(lSon(node), st, mij, x, y);
}
if (y > mij) {
r = query(rSon(node), mij + 1, dr, x, y);
}
if (l.d > r.d) {
qi = l.src;
return l;
}
else {
qi = r.src;
return r;
}
}
int cmp(int a, int b) {
return v[a] < v[b];
}
bool comp(int i, int j) {
if (cutii[i].a > cutii[j].a && cutii[i].b > cutii[j].b && cutii[i].c > cutii[j].c)
return true;
return false;
}
int nrm[MaxN];
int main() {
int n, t, i, j;
int nr;
fin >> n >> t;
while (t--) {
for (int i = 1; i <= 4 * n; ++i)
tree[i].d = tree[i].src = 0;
for (i = 1; i <= n; ++i) {
fin >> cutii[i].a >> cutii[i].b >> cutii[i].c;
k[i] = sol[i] = nrm[i] = 0;
v[i] = 1;
ind[i] = i;
qi = 0;
}
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
if (comp(i, j))
++v[i];
sort(ind + 1, ind + n + 1, cmp);////sortare cu tot cu indici
j = 0;
for (i = 1; i <= n; ++i) {////partea de normalizare
if (v[ind[i]] == v[ind[i - 1]]) {
nrm[ind[i]] = j;
}
else {
++j;
nrm[ind[i]] = j;
}
}
for (i = 1; i <= n; ++i) {
qi = 0;
if (nrm[i] != 1) {
nr = query(1, 1, n, 1, nrm[i] - 1).d + 1;
}
else {
nr = 1;
}
k[i] = qi;
update(1, 1, n, nrm[i], nr, i);
}
fout << tree[1].d << "\n";
}
fin.close();
fout.close();
return 0;
}