program casino;
Uses sysutils;
{$H+}
const lung=1000000;
var N,M,C,w,v,coppie,index:Int64;
temp: AnsiString;
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
temp:=x+x;
len:=length(x);
for i:=1 to len do funz_errore[i]:=-1; (*inizializzo la funzione errore a -1*)
K:=0;
for j:=1 to 2*len do
begin
i:=1;
while (i <> -1 ) and (x[j mod len] <> x[(k + i + 1 ) mod len]) do
begin
i:=funz_errore[j - k - 1];
if x[j mod len] < x[(k + i + 1) mod len] then k:= j - i - 1;
i:= funz_errore[i];
end;
if (i = -1) and (s[j mod len ] <> s[(k + i+1 ) mod len ]) then
begin
if s[j mod len] < s[(k + i+1 ) mod len] then k:= j;
funz_errore[j - k]:= -1;
end
else
funz_errore[j - k]:= i + 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 readln(S[w]);
coppie:=0;
for w:=0 to N-1 do
begin
index:=LexicalMinRotation(S[w]);
writeln(index);
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.
cHJvZ3JhbSBjYXNpbm87ClVzZXMgc3lzdXRpbHM7CnskSCt9CmNvbnN0IGx1bmc9MTAwMDAwMDsKdmFyICBOLE0sQyx3LHYsY29wcGllLGluZGV4OkludDY0OwogICAgIHRlbXA6IEFuc2lTdHJpbmc7CiAgICAgUyxTX3J1b3RhdGU6YXJyYXlbMC4ubHVuZ10gb2YgQW5zaVN0cmluZzsKICAgICBmdW56X2Vycm9yZSA6IGFycmF5WzAuLjIwMDAwMDBdIG9mIEludDY0OwpmdW5jdGlvbiBMZXhpY2FsTWluUm90YXRpb24odmFyIHg6IEFuc2lTdHJpbmcpOkludDY0Owp2YXIgCmxlbixLLGksajpJbnQ2NDsKCmJlZ2luCiAgIHRlbXA6PXgreDsKICAgbGVuOj1sZW5ndGgoeCk7CiAgIGZvciBpOj0xIHRvIGxlbiBkbyBmdW56X2Vycm9yZVtpXTo9LTE7ICgqaW5pemlhbGl6em8gbGEgZnVuemlvbmUgZXJyb3JlIGEgLTEqKQogICBLOj0wOwogICBmb3Igajo9MSB0byAyKmxlbiBkbwogICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICBpOj0xOwogICAgICAgICAgICAgd2hpbGUgKGkgPD4gLTEgKSBhbmQgKHhbaiBtb2QgbGVuXSA8PiB4WyhrICsgaSArIDEgKSBtb2QgbGVuXSkgZG8gCiAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICBpOj1mdW56X2Vycm9yZVtqIC0gayAtIDFdOwogICAgICAgICAgICAgICAgICAgICBpZiB4W2ogbW9kIGxlbl0gPCB4WyhrICsgaSArIDEpIG1vZCBsZW5dIHRoZW4gazo9IGogLSBpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgaTo9IGZ1bnpfZXJyb3JlW2ldOyAKICAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICBpZiAoaSA9IC0xKSBhbmQgKHNbaiBtb2QgbGVuIF0gPD4gc1soayArIGkrMSApIG1vZCBsZW4gXSkgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc1tqIG1vZCBsZW5dIDwgc1soayArIGkrMSApIG1vZCBsZW5dIHRoZW4gazo9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuel9lcnJvcmVbaiAtIGtdOj0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW56X2Vycm9yZVtqIC0ga106PSBpICsgMTsKICAgICAgICAgICAgICAgCiAgICAgICAgIGVuZDsgICAKIExleGljYWxNaW5Sb3RhdGlvbjo9azsKICAgICAKZW5kOwoKYmVnaW4KICAgKCphc3NpZ24oaW5wdXQsICdpbnB1dC50eHQnKTsgcmVzZXQoaW5wdXQpOwogICBhc3NpZ24ob3V0cHV0LCAnb3V0cHV0LnR4dCcpOyByZXdyaXRlKG91dHB1dCk7KikKICAgcmVhZGxuIChOLE0pOwogICBmb3Igdzo9MCB0byBOLTEgZG8gcmVhZGxuKFNbd10pOyAKICAgY29wcGllOj0wOyAKICAgZm9yIHc6PTAgdG8gTi0xIGRvCiAgICAgICAgICBiZWdpbgogICAgICAgICAgICBpbmRleDo9TGV4aWNhbE1pblJvdGF0aW9uKFNbd10pOwogICAgICAgICAgICB3cml0ZWxuKGluZGV4KTsKICAgICAgICAgICAgU19ydW90YXRlW3ddOj1jb3B5KHRlbXAsaW5kZXgsTSk7CiAgICAgICAgICAgIHdyaXRlbG4oU19ydW90YXRlW3ddKTsKICAgICAgICAgIGVuZDsgCiAgICBmb3Igdzo9MCB0byBOLTIgZG8gIAogICAgICAgICAgICAgZm9yIHY6PXcrMSB0byBOLTEgZG8KICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICBDOj0gQ29tcGFyZVN0cihTX3J1b3RhdGVbd10sIFNfcnVvdGF0ZVt2XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgQz0wIHRoZW4gY29wcGllOj1jb3BwaWUrMTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOyAKICAgIHdyaXRlbG4gKGNvcHBpZSk7CmVuZC4=