program casino;
Uses sysutils;
{$H+}
const lung=1000000;
var N,M,C,w,v,coppie,index:Int64;
temp: AnsiString;
stringa:array[0..lung] of char;
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
len:=length(x);
for i:=0 to len do funz_errore[i]:=-1;
K:=1;
for j:=2 to len do
begin
i:=funz_errore[j - k-1 ];
while (i <> -1 ) and (x[j] <> x[(k + i )]) do
begin
if x[j] < x[(k + i )] 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]:= -1;
end
else funz_errore[j - k]:= i + 1;
end;
LexicalMinRotation:=k;
writeln(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;
for w:=0 to N-1 do
begin
index:=LexicalMinRotation(S[w]);
temp:=S[w]+S[w];
S_ruotate[w]:=copy(temp,index,M);
writeln(S_ruotate[w]);
end;
for w:=0 to N-2 do
for v:=w+1 to N-1 do
begin
C:= CompareStr(S_ruotate[w], S_ruotate[v]);
if C=0 then coppie:=coppie+1;
end;
writeln (coppie);
end.
cHJvZ3JhbSBjYXNpbm87ClVzZXMgc3lzdXRpbHM7CnskSCt9CmNvbnN0IGx1bmc9MTAwMDAwMDsKdmFyICBOLE0sQyx3LHYsY29wcGllLGluZGV4OkludDY0OwogICAgIHRlbXA6IEFuc2lTdHJpbmc7CiAgICAgc3RyaW5nYTphcnJheVswLi5sdW5nXSBvZiBjaGFyOwogICAgIFMsU19ydW90YXRlOmFycmF5WzAuLmx1bmddIG9mIEFuc2lTdHJpbmc7CiAgICAgZnVuel9lcnJvcmUgOiBhcnJheVswLi4yMDAwMDAwXSBvZiBJbnQ2NDsKCmZ1bmN0aW9uIExleGljYWxNaW5Sb3RhdGlvbih2YXIgeDogQW5zaVN0cmluZyk6SW50NjQ7CnZhciAKbGVuLEssaSxqOkludDY0OwoKYmVnaW4KICAgbGVuOj1sZW5ndGgoeCk7IAogICBmb3IgaTo9MCB0byBsZW4gZG8gZnVuel9lcnJvcmVbaV06PS0xOwogICBLOj0xOyAKICAgZm9yIGo6PTIgdG8gbGVuIGRvCiAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgIGk6PWZ1bnpfZXJyb3JlW2ogLSBrLTEgXTsKICAgICAgICAgICAgIHdoaWxlIChpIDw+IC0xICkgYW5kICh4W2pdIDw+IHhbKGsgKyBpICldKSBkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeFtqXSA8IHhbKGsgKyBpICldIHRoZW4gazo9IGogLSBpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTo9IGZ1bnpfZXJyb3JlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaSA9IC0xKSBhbmQgKHhbal0gPD4geFsoayArIGkrMSApXSkgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHhbal0gPCB4WyhrICsgaSsxICldIHRoZW4gazo9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW56X2Vycm9yZVtqIC0gaysxXTo9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICBmdW56X2Vycm9yZVtqIC0ga106PSBpICsgMTsKICAgICAgICAgICAgICAgCiAgICAgICAgIGVuZDsgICAKIExleGljYWxNaW5Sb3RhdGlvbjo9azsKICB3cml0ZWxuKEspOyAgIAplbmQ7CgpiZWdpbgogICAoKmFzc2lnbihpbnB1dCwgJ2lucHV0LnR4dCcpOyByZXNldChpbnB1dCk7CiAgIGFzc2lnbihvdXRwdXQsICdvdXRwdXQudHh0Jyk7IHJld3JpdGUob3V0cHV0KTsqKQogICByZWFkbG4gKE4sTSk7CiAgIGZvciB3Oj0wIHRvIE4tMSBkbyBiZWdpbiByZWFkbG4oU1t3XSk7ICBTW3ddOj1UcmltKFNbd10pOyBlbmQ7CiAgIGNvcHBpZTo9MDsgCiAgIGZvciB3Oj0wIHRvIE4tMSBkbwogICAgICAgICAgYmVnaW4KICAgICAgICAgICAgCiAgICAgICAgICAgIGluZGV4Oj1MZXhpY2FsTWluUm90YXRpb24oU1t3XSk7CiAgICAgICAgICAgIHRlbXA6PVNbd10rU1t3XTsKICAgICAgICAgICAgU19ydW90YXRlW3ddOj1jb3B5KHRlbXAsaW5kZXgsTSk7CiAgICAgICAgICAgIHdyaXRlbG4oU19ydW90YXRlW3ddKTsKICAgICAgICAgIGVuZDsKICAgIGZvciB3Oj0wIHRvIE4tMiBkbyAgCiAgICAgICAgICAgICBmb3Igdjo9dysxIHRvIE4tMSBkbwogICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgIEM6PSBDb21wYXJlU3RyKFNfcnVvdGF0ZVt3XSwgU19ydW90YXRlW3ZdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBDPTAgdGhlbiBjb3BwaWU6PWNvcHBpZSsxOwogICAgICAgICAgICAgICAgICAgICAgICBlbmQ7IAogICAgd3JpdGVsbiAoY29wcGllKTsKZW5kLg==