#include <bits/stdc++.h>
using namespace std;
int n, res, p[5555], d[5555], brd[5555];
bool mark[1555], a[1555][1555];
void idar(int x) {
  int i;
  mark[x] = true;
  d[x] = 1;
  if (d[x] > res) res = d[x];
  for (i = 0; i < n; i++) {
    if (a[x][i]) {
      if (!mark[i]) idar(i);
      if (d[i] + 1 > d[x]) d[x] = d[i] + 1;
    }
  }
  return;
}
int main() {
  int k, i, j, l, x;
  scanf("%d%d", &n, &k);
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      a[i][j] = true;
      if (i == j) a[i][j] = false;
    }
  }
  for (l = 0; l < k; l++) {
    for (i = 0; i < n; i++) {
      scanf("%d", &p[i]);
      p[i]--;
    }
    for (i = 0; i < n; i++) {
      for (j = i + 1; j < n; j++) {
        a[p[j]][p[i]] = false;
      }
    }
  }
  for (i = 0; i < n; i++) {
    brd[i] = 0;
    for (j = 0; j < n; j++) {
      brd[i] += a[i][j];
    }
    mark[i] = false;
  }
  res = 0;
  for (l = 0; l < n; l++) {
    for (i = 0; i < n; i++) {
      if (!mark[i] && brd[i] == 0) {
        x = i;
        break;
      }
    }
    mark[x] = true;
    d[x] = 1;
    for (i = 0; i < n; i++) {
      if (a[x][i]) {
        if (d[i] + 1 > d[x]) d[x] = d[i] + 1;
      }
      if (a[i][x]) {
        brd[i]--;
      }
    }
    if (d[x] > res) res = d[x];
  }
  printf("%d\n", res);
  return 0;
}
