program subjects;
const
MAXN = 100000;
MAXM = 1000;
var
M, N, P, i, j, h: LongInt;
K : Array[0..MAXN-1] of LongInt;
S : Array[0..MAXN-1] of Array[0..5] of LongInt;
ans : Array[1..MAXM] of Array[1..2] of LongInt;
coppie : Array[1..MAXM,1..MAXM] of LongInt;
materia : Array[1..MAXM] of boolean;
begin
(*assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);*)
ReadLn(N, M);
for i:=1 to M do materia[i]:=false;
for i := 0 to N - 1 do
begin
Read(K[i]);
for j := 0 to K[i] - 1 do
begin
Read(S[i][j]);
materia[S[i][j]]:=true;
end;
end;
for i:=1 to M do
for j:=1 to M do coppie[i,j]:=0;
P:=0;
for i:=0 to N-1 do
begin
if K[i]>=1 then
begin
for j:=0 to K[i]-1 do
for h:= j+1 to K[i]-1 do
begin
coppie[S[i][j],S[i][h]]:=coppie[S[i][j],S[i][h]]+1;
coppie[S[i][h],S[i][j]]:=coppie[S[i][h],S[i][j]]+1;
end;
end;
end;
for i:=1 to M do
for j:= 1 to M do
if (coppie[i,j]=0) and (i<j) and (materia[i]=true) and (materia[j]=true) then
begin
P:=P+1;
ans[P][1]:=i; ans[P][2]:=j;
end;
WriteLn(P);
for i := 1 to P do
begin
for j := 1 to 2 do
Write(ans[i][j], ' ');
WriteLn();
end;
end.
cHJvZ3JhbSBzdWJqZWN0czsKCmNvbnN0CiAgICBNQVhOID0gMTAwMDAwOwogICAgTUFYTSA9IDEwMDA7Cgp2YXIKICAgIE0sIE4sIFAsIGksIGosIGg6IExvbmdJbnQ7CiAgICBLICAgICAgICAgICAgIDogQXJyYXlbMC4uTUFYTi0xXSBvZiBMb25nSW50OwogICAgUyAgICAgICAgICAgICA6IEFycmF5WzAuLk1BWE4tMV0gb2YgQXJyYXlbMC4uNV0gb2YgTG9uZ0ludDsKICAgIGFucyAgICAgICAgICAgOiBBcnJheVsxLi5NQVhNXSBvZiBBcnJheVsxLi4yXSBvZiBMb25nSW50OwogICAgY29wcGllICAgICAgICA6IEFycmF5WzEuLk1BWE0sMS4uTUFYTV0gb2YgTG9uZ0ludDsKICAgIG1hdGVyaWEgICAgICAgOiBBcnJheVsxLi5NQVhNXSBvZiBib29sZWFuOwogICAgCmJlZ2luCiAgICAoKmFzc2lnbihpbnB1dCwgICdpbnB1dC50eHQnKTsgIHJlc2V0KGlucHV0KTsKICAgIGFzc2lnbihvdXRwdXQsICdvdXRwdXQudHh0Jyk7IHJld3JpdGUob3V0cHV0KTsqKQoKICAgIFJlYWRMbihOLCBNKTsKICAgIAogICAgZm9yIGk6PTEgdG8gTSBkbyBtYXRlcmlhW2ldOj1mYWxzZTsKCiAgICBmb3IgaSA6PSAwIHRvIE4gLSAxIGRvIAogICAgYmVnaW4gICAgICAgIAogICAgICAgIFJlYWQoS1tpXSk7CiAgICAgICAgZm9yIGogOj0gMCB0byBLW2ldIC0gMSBkbwogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgIFJlYWQoU1tpXVtqXSk7CiAgICAgICAgICAgICAgbWF0ZXJpYVtTW2ldW2pdXTo9dHJ1ZTsKICAgICAgICAgICAgZW5kOyAgIAogICAgICAgICAgICAKICAgIGVuZDsKICAgIGZvciBpOj0xIHRvIE0gZG8KICAgICAgICAgIGZvciBqOj0xIHRvIE0gZG8gY29wcGllW2ksal06PTA7CiAgICBQOj0wOyAgICAgIAogICAgZm9yIGk6PTAgdG8gTi0xIGRvCiAgICAgICAgIGJlZ2luCiAgICAgICAgICAgIGlmIEtbaV0+PTEgdGhlbiAKICAgICAgICAgICAgICBiZWdpbiAKICAgICAgICAgICAgICAgICBmb3Igajo9MCB0byBLW2ldLTEgZG8gCiAgICAgICAgICAgICAgICAgICAgZm9yIGg6PSBqKzEgdG8gS1tpXS0xIGRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BwaWVbU1tpXVtqXSxTW2ldW2hdXTo9Y29wcGllW1NbaV1bal0sU1tpXVtoXV0rMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BwaWVbU1tpXVtoXSxTW2ldW2pdXTo9Y29wcGllW1NbaV1baF0sU1tpXVtqXV0rMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsgIAogICAgICAgICAgICAgZW5kOwogICAgICAgICBlbmQ7IAogICAgICAKICAgZm9yIGk6PTEgdG8gTSBkbwogICAgICAgZm9yIGo6PSAxIHRvICBNIGRvCiAgICAgICAgICAgIGlmIChjb3BwaWVbaSxqXT0wKSBhbmQgKGk8aikgYW5kIChtYXRlcmlhW2ldPXRydWUpIGFuZCAobWF0ZXJpYVtqXT10cnVlKSB0aGVuIAogICAgICAgICAgICAgICAgICAgICAgYmVnaW4gIAogICAgICAgICAgICAgICAgICAgICAgICBQOj1QKzE7CiAgICAgICAgICAgICAgICAgICAgICAgIGFuc1tQXVsxXTo9aTsgYW5zW1BdWzJdOj1qOwogICAgICAgICAgICAgICAgICAgICAgZW5kOyAgCiAgICAgICAgCiAgICBXcml0ZUxuKFApOwogICAgZm9yIGkgOj0gMSB0byBQIGRvIAogICAgYmVnaW4KICAgICAgICBmb3IgaiA6PSAxIHRvIDIgZG8KICAgICAgICAgICAgV3JpdGUoYW5zW2ldW2pdLCAnICcpOwogICAgICAgIFdyaXRlTG4oKTsKICAgIGVuZDsKCmVuZC4K