#include <stdio.h>
#define MAXN 3500
int x[MAXN], y[MAXN], z[MAXN];
int aib[MAXN + 2][MAXN + 2];
inline int ultb(int x){
return x & (-x);
}
inline int max2(int a, int b){
return a > b ? a : b;
}
inline int maxim(int y, int z){
int cz, rez = 0;
while(y > 0){
cz = z;
while(cz > 0){
rez = max2(rez, aib[y][cz]);
cz &= cz - 1;
}
y &= y - 1;
}
return rez;
}
inline void add(int y, int z, int n, int val){
int cz;
while(y <= n){
cz = z;
while(cz <= n){
aib[y][cz] = max2(aib[y][cz], val);
cz += ultb(cz);
}
y += ultb(y);
}
}
inline void intersch(int i, int j){
int aux;
aux = x[i]; x[i] = x[j]; x[j] = aux;
aux = y[i]; y[i] = y[j]; y[j] = aux;
aux = z[i]; z[i] = z[j]; z[j] = aux;
}
inline char better(int a1, int b1, int c1, int a2, int b2, int c2){
if(a1 < a2)
return 0;
if(a1 > a2)
return 1;
if(b1 > b2)
return 0;
if(b1 < b2)
return 1;
if(c1 > c2)
return 0;
if(c1 < c2)
return 1;
return 0;
}
void qs(int st, int dr){
int i = st, j = dr, min = (st + dr) / 2, pivx = x[min], pivy = y[min], pivz = z[min];
while(i <= j){
while(better(pivx, pivy, pivz, x[i], y[i], z[i]))
i++;
while(better(x[j], y[j], z[j], pivx, pivy, pivz))
j--;
if(i <= j){
intersch(i, j);
i++; j--;
}
}
if(st < j)
qs(st, j);
if(i < dr)
qs(i, dr);
}
int main(){
FILE *in = fopen("cutii.in", "r");
FILE *out = fopen("cutii.out", "w");
int t, n, i, j, max, k;
fscanf(in, "%d%d", &n, &t);
for(; t > 0; t--){
for(i = 0; i < n; i++){
fscanf(in, "%d%d%d", &x[i], &y[i], &z[i]);
x[i]++; y[i]++; z[i]++;
}
qs(0, n - 1);
max = 0;
for(i = 0; i < n; i++){
k = maxim(y[i] - 1, z[i] - 1) + 1;
max = max2(max, k);
add(y[i], z[i], n + 1, k);
}
fprintf(out, "%d\n", max);
for(k = 0; k < n; k++)
for(i = y[k]; i <= n + 1; i += ultb(i))
for(j = z[k]; j <= n + 1; j += ultb(j))
aib[i][j] = 0;
}
fclose(in);
fclose(out);
return 0;
}