program concurs;
var f,g:text;
i,csere2,l,csere,p,min,hej,max,hany,o,k,db:integer;
e,uje:array[1..1000] of integer;
j,ujj:array[1..50] of integer;
s:array[1..50] of integer;
n:array[1..50] of byte;
begin
assign(f,'concurs.in');
assign(g,'concurs.out');
reset(f);
rewrite(g);
readln(f,p);
while not eof(f) do
begin
db:=db+1;
read(f,j[db],e[db]);
readln(f);
end;
for i:=1 to p do
if s[j[i]] = 0 then
s[j[i]]:=1;
for i:=1 to 50 do
if s[i]=1 then
o:=o+1;
writeln(g,o);
db:=1;
for i:=1 to 50 do
begin
if j[i] <>0 then
begin
for k:=1 to 50 do
begin
if j[i]=k then
n[k]:=n[k]+1;
end;
db:=db+1;
end;
end;
for i:=1 to 50 do
if n[i]<>0 then
write(g,n[i],' ');
writeln(g);
min:=maxint;
for k:=1 to p do
begin
for i:=1 to p do
begin
if e[i]<min then
begin
min:=e[i];
hej:=i;
end;
end;
ujj[k]:=j[hej];
uje[k]:=e[hej];
min:=maxint;
e[hej]:=maxint;
j[hej]:=maxint;
end;
for i:=1 to p-1 do
begin
if (ujj[i] = uje[i+1]) or (ujj[i] = ujj[i-1]) then
begin
csere:=ujj[i];
ujj[i]:=ujj[i+1];
ujj[i+1]:=csere;
csere2:=uje[i];
uje[i]:=uje[i+1];
uje[i+1]:=csere2;
end;
end;
for i:=1 to p do
writeln(g,ujj[i],' ',uje[i]);
close(g);
end.