var
a,k:array[0..7] of word;
duyet:array[0..7] of boolean;
i,n:byte;
dem:word;
f:text;
const fi='DIENKINH.INP';
fo='DIENKINH.OUT';
procedure xuat;
var ii:byte;
begin
for ii:=1 to n do write(f,k[ii],' ');writeln(f);inc(dem);
end;
procedure hoanvi(i:byte);
var j:byte;
begin
if i<=n then
for j:=1 to n do
begin
if duyet[j]=true then
begin
k[i]:=a[j];
duyet[j]:=false;
hoanvi(i+1);
duyet[j]:=true;
end;
end
else xuat;
end;
begin
assign(f,fi);reset(f);
readln(f,n);
for i:=1 to n do read(f,a[i]);
close(f);
assign(f,fo);rewrite(f);
fillchar(duyet,sizeof(duyet),true);
hoanvi(1);
writeln(f,dem);
close(f);
end.