{
TASK:MATRIX
LANG:PASCAL
}
var
a:Array[1..1000,1..1000] of integer;
b:array[1..1000] of qword;
vis:array[1..1000] of byte;
xorr:array[1..1000] of integer;
count,k,i,j,n,m:integer;

procedure swap(var a:integer;var b:integer);
var x:integer;
begin
x:=a;
a:=b;
b:=x;
end;

function check(a1,a2:integer):boolean;
var rec:boolean;i1,j1:integer;
begin
rec:=true;
for i1:=1 to m-1 do
 for j1:=i1+1 to m do if a[a1][i1]<a[a1][j1] then swap(a[a1][i1],a[a1][j1]);
for i1:=1 to m-1 do
 for j1:=i1+1 to m do if a[a2][i1]<a[a2][j1] then swap(a[a2][i1],a[a2][j1]);
for i1:=1 to m do if a[a2][i1]<>a[a1][i1] then begin rec:=false;break;end;

check:=rec;
end;

begin
readln(n,m);
for i:=1 to n do
 for j:=1 to m do begin
                  read(a[i][j]);
                  b[i]:=b[i]+a[i,j];
                  xorr[i]:=xorr[i] xor a[i,j];
                  end;
count:=n;
for i:=1 to n-1 do
  for j:=i+1 to n do
   if  (b[i]=b[j]) and (not((vis[i]=1)and(vis[j]=1)))
   and (xorr[i]=xorr[j]) then
      if check(i,j) then begin dec(count);vis[i]:=1;vis[j]:=1;end;
writeln(count);
end.
