program casino;
Uses sysutils;
{$H+}
const lung=1000000;
var N,M,C,w,v,coppie,index:Int64;
S,S_ruotate:array[0..lung] of AnsiString;
funz_errore : array[0..2000000] of Int64;
function LexicalMinRotation(var x: AnsiString):Int64;
var
len,K,i,j:Int64;
begin
x:=x+x;
len:=length(x);
for i:=0 to len do funz_errore[i]:=-1;
K:=1;
j:=2;
while j<=len do begin
i:= funz_errore[j-k-1];
while (i <> -1 ) and (x[j] <> x[(k + i+1 )]) and (j<=len ) do
begin
if x[j] < x[(k + i+1 )] then k:= j - i - 1;
i:=funz_errore[i];
end;
if (i = -1) and (x[j] <> x[(k + i+1 )]) then
begin
if x[j] < x[(k + i+1 )] then k:= j;
funz_errore[j - k]:= -1;
end
else funz_errore[j - k]:= i + 1;
j:=j+1; end;
LexicalMinRotation:=k;
end;
begin
(*assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);*)
readln (N,M);
for w:=0 to N-1 do begin readln(S[w]); S[w]:=Trim(S[w]); end;
coppie:=0;
index:=LexicalMinRotation(S[0]);
S_ruotate[0]:=copy(S[0],index,M);
for w:=1 to N-1 do
begin
index:=LexicalMinRotation(S[w]);
S_ruotate[w]:=copy(S[w],index,M);
if S_ruotate[w]=S_ruotate[0] then coppie:=coppie+1;
end;
writeln(coppie);
end.
cHJvZ3JhbSBjYXNpbm87ClVzZXMgc3lzdXRpbHM7CnskSCt9CmNvbnN0IGx1bmc9MTAwMDAwMDsKdmFyICBOLE0sQyx3LHYsY29wcGllLGluZGV4OkludDY0OwogICAgIFMsU19ydW90YXRlOmFycmF5WzAuLmx1bmddIG9mIEFuc2lTdHJpbmc7CiAgICAgZnVuel9lcnJvcmUgOiBhcnJheVswLi4yMDAwMDAwXSBvZiBJbnQ2NDsKICAgIApmdW5jdGlvbiBMZXhpY2FsTWluUm90YXRpb24odmFyIHg6IEFuc2lTdHJpbmcpOkludDY0Owp2YXIgCmxlbixLLGksajpJbnQ2NDsKCmJlZ2luCiAgIHg6PXgreDsKICAgbGVuOj1sZW5ndGgoeCk7IAogICBmb3IgaTo9MCB0byBsZW4gIGRvIGZ1bnpfZXJyb3JlW2ldOj0tMTsKICAgSzo9MTsgCiAgIGo6PTI7CiAgICAgIHdoaWxlIGo8PWxlbiBkbyBiZWdpbiAgICAgICAgIAogICAgICAgICAgICAgaTo9IGZ1bnpfZXJyb3JlW2otay0xXTsKICAgICAgICAgICAgIHdoaWxlIChpIDw+IC0xICkgYW5kICh4W2pdIDw+IHhbKGsgKyBpKzEgKV0pIGFuZCAoajw9bGVuICkgZG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4W2pdIDwgeFsoayArIGkrMSApXSB0aGVuIGs6PSBqIC0gaSAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk6PWZ1bnpfZXJyb3JlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaSA9IC0xKSBhbmQgKHhbal0gPD4geFsoayArIGkrMSApXSkgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHhbal0gPCB4WyhrICsgaSsxICldIHRoZW4gazo9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW56X2Vycm9yZVtqIC0ga106PSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgZnVuel9lcnJvcmVbaiAtIGtdOj0gaSArIDE7CiAgICAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICBqOj1qKzE7IGVuZDsKIExleGljYWxNaW5Sb3RhdGlvbjo9azsKICAgICAKZW5kOwoKYmVnaW4KICAgKCphc3NpZ24oaW5wdXQsICdpbnB1dC50eHQnKTsgcmVzZXQoaW5wdXQpOwogICBhc3NpZ24ob3V0cHV0LCAnb3V0cHV0LnR4dCcpOyByZXdyaXRlKG91dHB1dCk7KikKICAgcmVhZGxuIChOLE0pOwogICBmb3Igdzo9MCB0byBOLTEgZG8gYmVnaW4gcmVhZGxuKFNbd10pOyAgU1t3XTo9VHJpbShTW3ddKTsgZW5kOwogICBjb3BwaWU6PTA7IAogICBpbmRleDo9TGV4aWNhbE1pblJvdGF0aW9uKFNbMF0pOwogICBTX3J1b3RhdGVbMF06PWNvcHkoU1swXSxpbmRleCxNKTsKICAgZm9yIHc6PTEgdG8gTi0xIGRvCiAgICAgICAgICBiZWdpbgogICAgICAgICAgICBpbmRleDo9TGV4aWNhbE1pblJvdGF0aW9uKFNbd10pOwogICAgICAgICAgICBTX3J1b3RhdGVbd106PWNvcHkoU1t3XSxpbmRleCxNKTsKICAgICAgICAgICAgaWYgU19ydW90YXRlW3ddPVNfcnVvdGF0ZVswXSB0aGVuICBjb3BwaWU6PWNvcHBpZSsxOwogICAgICAgICAgZW5kOwogICAKICAgIHdyaXRlbG4oY29wcGllKTsKZW5kLgogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIA==