const N:array[0..19] of longint = (10,20,50,100,200,400,700 ,800 ,900 ,2000,15000,20000,40000,50000,60000,70000 ,80000 ,90000 ,95000 ,100000);
M:array[0..19] of longint = (20,30,90,300,400,700,1999,2999,3999,7130,50000,60000,70000,90000,80000,150000,400000,350000,800000,1000000);
var i,j,t,x,y,tg:longint;
s:string;
ch:char;
f:text;
lx,ly:array[1..1000001] of longint;
sl:longint;
procedure qsort(l,r:longint);
var i,j,tg,midx,midy:longint;
begin
i:=l;
j:=r;
midx:=lx[(i+j)div 2];
midy:=ly[(i+j)div 2];
while i<=j do
begin
while (lx[i]<midx)or((lx[i]=midx)and(ly[i]<midy)) do i:=i+1;
while (lx[j]>midx)or((lx[j]=midx)And(ly[j]>midy)) do j:=j-1;
if i<=j then
begin
tg:=lx[i];lx[i]:=lx[j];lx[j]:=tg;
tg:=ly[i];ly[i]:=ly[j];ly[j]:=tg;
i:=i+1;
j:=j-1;
end;
end;
if i<r then qsort(i,r);
if j>l then qsort(l,j);
end;
//==========
procedure xl;
var i,j:longint;
begin
i:=1;
for j:=2 to sl do
if not ((lx[i]=lx[j]) and (ly[i]=ly[j])) then
begin
i:=i+1;
lx[i]:=lx[j];
ly[i]:=ly[j];
end;
sl:=i;
end;
//==========
begin
randomize;
for t:=0 to 19 do
begin
writeln('====Test',t,'====');
str(t,s);
if length(s)=1 then s:='0'+s;
s:='test'+s;
mkdir(s);
s:=s+'/cycle.inp';
assign(f,s);
rewrite(f);
x:=1;
sl:=0;
for i:=1 to m[t] do
begin
while true do
begin
x:=random(n[t])+1;
y:=random(n[t])+1;
if (x<>y) then break;
end;
if x>y then begin tg:=x;x:=y;y:=tg; end;
sl:=sl+1;
lx[sl]:=x;
ly[sl]:=y;
end;
qsort(1,sl);
xl;
writeln(f,n[t],' ',sl);
for i:=1 to sl do writeln(f,lx[i],' ',ly[i]);
close(f);
end;
end.