val:array['A'..'Z'] of longint;
use:array[0..26] of boolean;
i,j,k,n:longint;
find:boolean;
procedure print;
var i:longint;
begin
for i:=0 to n-2 do
write(val[chr(ord('A')+i)],' ');
writeln(val[chr(ord('A')+n-1)]);
find:=true;
end;
function check:boolean;
var k:longint;
begin
check:=true;
for k:=1 to n do
if (val[a[k]]<>-1)and(val[b[k]]<>-1)and(val[c[k]]<>-1)
then if ((val[a[k]]+val[b[k]]) mod n<>val[c[k]])
and((val[a[k]]+val[b[k]]+1) mod n<>val[c[k]]) then exit;
check:=false;
end;
procedure search(k,left:longint);
var i,j:longint;
cana,canb,canc:boolean;
begin
if k=0
then begin
if left=0 then print;
exit;
end;
if check then exit;
cana:=false;
if val[a[k]]<>-1 then cana:=true;
for i:=n-1 downto 0 do
if ((cana=false)and(use[i]))or((cana)and(i=val[a[k]]))
then begin
use[i]:=false;
val[a[k]]:=i;
canb:=false;
if val[b[k]]<>-1 then canb:=true;
for j:=n-1 downto 0 do
if ((canb=false)and(use[j]))or((canb)and(j=val[b[k]]))
then begin
use[j]:=false;
val[b[k]]:=j;
canc:=false;
if val[c[k]]<>-1 then canc:=true;
if ((canc=false)and(use[(i+j+left) mod n]))or((canc)
and ((i+j+left) mod n=val[c[k]]))
then begin
use[(i+j+left) mod n]:=false;
val[c[k]]:=(i+j+left) mod n;
search(k-1,(i+j+left) div n);
if find then exit;
if canc=false
then begin
use[(i+j+left) mod n]:=true;
val[c[k]]:=-1;
end;
end;
if canb=false then begin use[j]:=true; val[b[k]]:=-1; end;
end;
if cana=false
then begin
use[i]:=true;
val[a[k]]:=-1;
end;
end;
end;
begin
while not seekeof do
begin
readln(n);
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to n do
read(b[i]);
readln;
for i:=1 to n do
read(c[i]);
readln;
fillchar(val,sizeof(val),byte(-1));
fillchar(use,sizeof(use),true);
find:=false;
search(n,0);
end;
end.