program casino;
const max=40000;
type testo=array[0..max] of array[0..max] of char;
subtesto=array[0..max] of char;
ps=array[0..max] of longint;
var N,M,i,j,z,coppie:longint;
str:testo;
A,B:subtesto;
c:char;
lps: array[0..max] of longint;
uscita, isrot:boolean;
procedure isRotation (x:subtesto;y:subtesto);
var h,k,len:longint;
begin
len:=0; lps[0]:=0; h:=1;
while h< M do
begin
if x[h]=y[len] then
begin
len:=len+1;
lps[h]:=len;
h:=h+1;
end
else
begin
if len<>0 then len:=lps[len-1]
else
begin
lps[h]:=len;
h:=h+1;
end;
end;
end;
h:=0; k:=lps[M-1] ; uscita:=false;
while (k< M) and (h<M) and (uscita=false) do
begin
if y[k]<>x[h] then uscita:=true
else
begin h:=h+1; k:=k+1; end;
end;
if uscita=false then isRot:=true
else isRot:=false;
end;
begin
readln (N,M);
coppie:=0;
for i:=0 to N-1 do begin
for j:=0 to M-1 do read(str[i][j]);
readln; end;
for i:=0 to N-2 do
begin
for j:=0 to M-1 do A[j]:=str[i][j];
for z:=i+1 to N-1 do
begin
for j:=0 to M-1 do B[j]:=str[z][j];
isRotation(A,B);
writeln(i,' ',z,' ',isRot);
if isRot=true then coppie:=coppie+1;
end;
end;
for i:=0 to M-1 do write(LPS[i]); writeln;
writeln (coppie);
end.
cHJvZ3JhbSBjYXNpbm87IApjb25zdCBtYXg9NDAwMDA7CnR5cGUgdGVzdG89YXJyYXlbMC4ubWF4XSBvZiBhcnJheVswLi5tYXhdIG9mIGNoYXI7CiAgICAgc3VidGVzdG89YXJyYXlbMC4ubWF4XSBvZiBjaGFyOwogICAgIHBzPWFycmF5WzAuLm1heF0gb2YgbG9uZ2ludDsKdmFyIE4sTSxpLGoseixjb3BwaWU6bG9uZ2ludDsKICAgICBzdHI6dGVzdG87CiAgICAgQSxCOnN1YnRlc3RvOwogICAgIGM6Y2hhcjsKICAgICBscHM6IGFycmF5WzAuLm1heF0gb2YgbG9uZ2ludDsKICAgICB1c2NpdGEsIGlzcm90OmJvb2xlYW47CiAgICAgCiAgICAgCnByb2NlZHVyZSBpc1JvdGF0aW9uICh4OnN1YnRlc3RvO3k6c3VidGVzdG8pOwp2YXIgaCxrLGxlbjpsb25naW50OwpiZWdpbgogICBsZW46PTA7IGxwc1swXTo9MDsgaDo9MTsKCXdoaWxlIGg8IE0gZG8KCSAgICAgICAgIGJlZ2luCgkgICAgICAgICAgICBpZiB4W2hdPXlbbGVuXSB0aGVuIAoJICAgICAgICAgICAgICAgICAgICAgYmVnaW4KCSAgICAgICAgICAgICAgICAgICAgICAgbGVuOj1sZW4rMTsKCSAgICAgICAgICAgICAgICAgICAgICAgbHBzW2hdOj1sZW47CgkgICAgICAgICAgICAgICAgICAgICAgIGg6PWgrMTsKCSAgICAgICAgICAgICAgICAgICAgICBlbmQKCSAgICAgICAgICAgICAgICAgZWxzZQoJICAgICAgICAgICAgICAgICAgICAgYmVnaW4KCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbjw+MCB0aGVuIGxlbjo9bHBzW2xlbi0xXQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwc1toXTo9bGVuOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDo9aCsxOwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKCSAgICAgICAgICAgICAgICAgICAgICBlbmQ7CgkgICAgICAgICAgZW5kOyAKICAgaDo9MDsgazo9bHBzW00tMV0gOyB1c2NpdGE6PWZhbHNlOwogICB3aGlsZSAoazwgTSkgYW5kIChoPE0pIGFuZCAodXNjaXRhPWZhbHNlKSBkbwogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgIGlmIHlba108PnhbaF0gdGhlbiAgdXNjaXRhOj10cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gaDo9aCsxOyBrOj1rKzE7IGVuZDsKICAgICAgICAgICAgZW5kOyAKICAgICAgICAgICAgIGlmIHVzY2l0YT1mYWxzZSB0aGVuIGlzUm90Oj10cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpc1JvdDo9ZmFsc2U7CmVuZDsKCgpiZWdpbgoKICAgcmVhZGxuIChOLE0pOwogICBjb3BwaWU6PTA7CiAgICAgZm9yIGk6PTAgdG8gTi0xIGRvIGJlZ2luCiAgICAgICAgIGZvciBqOj0wIHRvIE0tMSBkbyAgIHJlYWQoc3RyW2ldW2pdKTsKCXJlYWRsbjsgZW5kOwoJCiAgZm9yIGk6PTAgdG8gTi0yIGRvIAogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgZm9yIGo6PTAgdG8gTS0xIGRvIEFbal06PXN0cltpXVtqXTsgCiAgICAgICAgICAgICAgICBmb3Igejo9aSsxIHRvIE4tMSBkbyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igajo9MCB0byBNLTEgZG8gQltqXTo9c3RyW3pdW2pdOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JvdGF0aW9uKEEsQik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVsbihpLCcgJyx6LCcgJyxpc1JvdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNSb3Q9dHJ1ZSB0aGVuIGNvcHBpZTo9Y29wcGllKzE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBlbmQ7IAogICAgICAgICAgICBmb3IgaTo9MCB0byBNLTEgZG8gd3JpdGUoTFBTW2ldKTsgd3JpdGVsbjsKICAgICAgICAgICAgd3JpdGVsbiAoY29wcGllKTsKZW5kLgo=