uses math;
const fi='';
fo='';
maxn=10;
type data=longint;
var x :array[1..2*maxn] of longint;
i,j,n,m :longint;
st :array[1..2*maxn] of longint;
kq :array[1..10001,1..2*maxn] of longint;
res :int64;
cx :array[1..2*maxn] of boolean;
procedure enter;
begin
assign(input,fi);reset(input);
readln(n);
close(input);
end;
function ngto(x : longint) : boolean;
var i :longint;
begin
for i:=2 to trunc(sqrt(x)) do
if x mod i = 0 then exit(false);
exit(true);
end;
procedure cnkl;
begin
if ngto(x[2*n]+x[1]) then
begin
inc(res);
if res<=10000 then
kq[res] := x;
end;
end;
procedure try(i : longint);
var j :longint;
begin
for j:= 1 to 2*n do
if cx[j] then
if ngto(j+x[i-1]) then
begin
x[i] := j;
cx[j] := false;
if i=2*n then cnkl else try(i+1);
cx[j] := true;
end;
end;
procedure process;
begin
{for i:=2 to 2*n do
if ngto(i) then
begin
inc(m);
st[m] := i;
end; }
fillchar(cx,sizeof(cx),true);
cx[1] := false;
x[1] := 1;
try(2);
end;
procedure print;
begin
assign(output,fo);rewrite(output);
writeln(res);
for i:=1 to min(res,10000) do
begin
for j:=1 to 2*n do write(kq[i,j],' ');
writeln;
end;
close(output);
end;
begin
enter;
process;
print;
end.
dXNlcyAgICBtYXRoOwogCmNvbnN0ICAgZmk9Jyc7CiAgICAgICAgZm89Jyc7CiAgICAgICAgbWF4bj0xMDsKIAp0eXBlICAgIGRhdGE9bG9uZ2ludDsKIAp2YXIgICAgIHggICAgICAgOmFycmF5WzEuLjIqbWF4bl0gb2YgbG9uZ2ludDsKICAgICAgICBpLGosbixtIDpsb25naW50OwogICAgICAgIHN0ICAgICAgOmFycmF5WzEuLjIqbWF4bl0gb2YgbG9uZ2ludDsKICAgICAgICBrcSAgICAgIDphcnJheVsxLi4xMDAwMSwxLi4yKm1heG5dIG9mIGxvbmdpbnQ7CiAgICAgICAgcmVzICAgICA6aW50NjQ7CiAgICAgICAgY3ggICAgICA6YXJyYXlbMS4uMiptYXhuXSBvZiBib29sZWFuOwogCnByb2NlZHVyZSBlbnRlcjsKYmVnaW4KICAgICAgICBhc3NpZ24oaW5wdXQsZmkpO3Jlc2V0KGlucHV0KTsKICAgICAgICByZWFkbG4obik7CiAgICAgICAgY2xvc2UoaW5wdXQpOwplbmQ7CiAKZnVuY3Rpb24gbmd0byh4IDogbG9uZ2ludCkgOiBib29sZWFuOwp2YXIgICAgIGkgICAgICAgOmxvbmdpbnQ7CmJlZ2luCiAgICAgICAgZm9yIGk6PTIgdG8gdHJ1bmMoc3FydCh4KSkgZG8KICAgICAgICAgICAgICAgIGlmIHggbW9kIGkgPSAwIHRoZW4gZXhpdChmYWxzZSk7CiAgICAgICAgZXhpdCh0cnVlKTsKZW5kOwogCnByb2NlZHVyZSBjbmtsOwpiZWdpbgogICAgICAgIGlmIG5ndG8oeFsyKm5dK3hbMV0pIHRoZW4KICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgIGluYyhyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiByZXM8PTEwMDAwIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAga3FbcmVzXSA6PSB4OwogICAgICAgICAgICAgICAgZW5kOwplbmQ7CiAKcHJvY2VkdXJlIHRyeShpIDogbG9uZ2ludCk7CnZhciAgICAgaiA6bG9uZ2ludDsKYmVnaW4KICAgICAgICBmb3Igajo9IDEgdG8gMipuIGRvCiAgICAgICAgICAgICAgICBpZiBjeFtqXSB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5ndG8oait4W2ktMV0pIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4W2ldIDo9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hbal0gOj0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaT0yKm4gdGhlbiBjbmtsIGVsc2UgdHJ5KGkrMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hbal0gOj0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOwplbmQ7CnByb2NlZHVyZSBwcm9jZXNzOwpiZWdpbgogICAgICAgIHtmb3IgaTo9MiB0byAyKm4gZG8KICAgICAgICAgICAgICAgIGlmIG5ndG8oaSkgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYyhtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdFttXSA6PSBpOwogICAgICAgICAgICAgICAgICAgICAgICBlbmQ7ICAgICB9CiAgICAgICAgZmlsbGNoYXIoY3gsc2l6ZW9mKGN4KSx0cnVlKTsKICAgICAgICBjeFsxXSA6PSBmYWxzZTsKICAgICAgICB4WzFdIDo9IDE7CiAgICAgICAgdHJ5KDIpOwplbmQ7CiAKcHJvY2VkdXJlIHByaW50OwpiZWdpbgogICAgICAgIGFzc2lnbihvdXRwdXQsZm8pO3Jld3JpdGUob3V0cHV0KTsKICAgICAgICB3cml0ZWxuKHJlcyk7CiAgICAgICAgZm9yIGk6PTEgdG8gbWluKHJlcywxMDAwMCkgZG8KICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBqOj0xIHRvIDIqbiBkbyB3cml0ZShrcVtpLGpdLCcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbG47CiAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgY2xvc2Uob3V0cHV0KTsKZW5kOwogCmJlZ2luCiAgICAgICAgZW50ZXI7CiAgICAgICAgcHJvY2VzczsKICAgICAgICBwcmludDsKZW5kLg==