const maxn = 1000; 
      maxm = 10;
var n: word;
    m: byte;
    d,a: array[1..maxm,1..maxn] of word;
    f: array[0..maxn] of word;
function check(a,b:word):boolean;
var i:word;
begin
  check:=true;
  for i:=2 to m do
  if (d[i,a]>d[i,b]) then 
  begin
    check:=false;
    break;
  end;
end;
procedure enter;
var i,j,res:word;
    b:boolean;
begin
  readln(n,m);
  res:=0;
  for i:=1 to m do
  begin
    for j:=1 to n do
    begin
      read(a[i,j]);
      d[i,a[i,j]]:=j;
    end;
    readln;
  end;
  f[0]:=0;
  for i:=1 to n do
  begin
    f[a[1,i]]:=1;
    for j:=1 to i-1 do
    if check(a[1,j],a[1,i]) then
    if f[a[1,j]]+1>f[a[1,i]] then
    f[a[1,i]]:=f[a[1,j]]+1;
    if f[a[1,i]]>res then res:=f[a[1,i]]
  end;
  writeln(res);
end;
begin
  enter;
end.
  