#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
const int NMAX = 3500;
struct box
{
int x, y, z;
bool operator < (const box other) const
{
if(z == other.z)
{
if(x == other.x)
return y < other.y;
return x < other.x;
}
return z < other.z;
}
};
box v[NMAX + 5];
int T, N;
int aib[NMAX + 5][NMAX + 5];
inline int LastBit(int i)
{
return i & (-i);
}
void Update(int l, int c, int val)
{
for(int i = l; i <= N; i += LastBit(i))
for(int j = c; j <= N; j += LastBit(j))
aib[i][j] = max(aib[i][j], val);
}
int Query(int l, int c)
{
int ans = 0;
for(int i = l; i > 0; i -= LastBit(i))
for(int j = c; j > 0; j -= LastBit(j))
ans = max(ans, aib[i][j]);
return ans;
}
void MakeZero(int l, int c)
{
for(int i = l; i <= N; i += LastBit(i))
for(int j = c; j <= N; j += LastBit(j))
aib[i][j] = 0;
}
int main()
{
fin >> N >> T;
while(T--)
{
for(int i = 1; i <= N; i++)
fin >> v[i].x >> v[i].y >> v[i].z;
sort(v + 1, v + N + 1);
int ans = 1;
Update(v[1].x, v[1].y, 1);
for(int i = 2; i <= N; i++)
{
int q = Query(v[i].x - 1, v[i].y - 1);
ans = max(ans, q + 1);
Update(v[i].x, v[i].y, q + 1);
}
fout << ans << '\n';
for(int i = 1; i <= N; i++)
MakeZero(v[i].x, v[i].y);
}
return 0;
}