program simboliu_keitimas;

  const MaxK = 700;
        DF ='SIMB.DAT';
        RF ='SIMB.REZ';


  type Virsune = record
         aIs : set of char;  { Iš kokių raidžių reikės keisti į šią. }
         aI : char;          { Į kokį simbolį reikės keisti šią raidę. }
       end;
       TGrafas = array ['A' .. 'Z'] of Virsune;

{ Tokiame masyve saugosiu surastą atsakymą. }
       TKaipKeisti = array [1 .. MaxK] of string[2];

  procedure Negalima;
    var f: text;
  begin
    assign (f, RF);
    rewrite (f);
    writeln(f, 0);
    close (f);
    halt;
  end;


{ Nuskaitau pradinius duomenis. }
  procedure Ivedimas(var Mas : TGrafas; var N : integer);
    var i : integer;
        cIs, cI : char;
        f: text;
  begin
{ Susidarau tuščią grafą. }
    for  cI := 'A' to 'Z' do
    begin
      Mas[cI].aIs := [];
      Mas[cI].aI := ' ';
    end;

    assign (f, DF);
    reset (f);
    readln(f, N);
    for i := 1 to N do
    begin
      read(f, cIs, cI);

{ Tikrinu, ar nėra kito keitimo, keisiančio šį simbolį. }
      if Mas[cIs].aI <> ' ' then Negalima;

      Mas[cIs].aI := cI;
      Mas[cI].aIs := Mas[cI].aIs + [cIs];

{ Jeigu tai nebuvo paskutinė pora, reikia nuskaityti tarpą, esantį tarp
keitimų. }
      if i <> N then
        read(f, cIs);
    end;
    close (f);
  end;


{ Randu simbolį, kurio jau nebereikės keisti į jokį kitą. }
  function VirsuneBeIsejimu(Mas : TGrafas) : char;
    var cI : char;
  begin
    for cI := 'A' to 'Z' do
      if (Mas[cI].aIs <> []) and (Mas[cI].aI = ' ') then
      begin
        VirsuneBeIsejimu := cI;
        exit;
      end;
    VirsuneBeIsejimu := ' ';
  end;


{ Ieško sprendinio.
  Jeigu sprendinys rastas, grąžina reikšmę TRUE ir, per parametrą kintamąjį Ats,
patį sprendinį.
  Jeigu sprendinys nerastas, grąžina reikšmę FALSE. }
  function Sprendimas(Mas : TGrafas; N : integer; var Ats : TKaipKeisti)
    : boolean;
    var II : integer;
        Virs, cI : char;
  begin
    Sprendimas := true;
    II := 0;

{ Suksiu ciklą, kol visus keitimus surikiuosiu teisingai }
    while n <> II do
    begin

{ Randu simbolį, kurio jau nebereikės keisti į jokį kitą. }
      Virs := VirsuneBeIsejimu(Mas);
      if Virs <> ' ' then
      begin

{ Pasižymiu, jog galiu atlikti visus keitimus susijusius su
rastuoju simboliu. }
        for cI := 'A' to 'Z' do
          if cI in Mas[Virs].aIs then
          begin
            Inc(II);
            Ats[II] := cI + Virs;
            Mas[cI].aI := ' ';
          end;
        Mas[Virs].aIs := [];

      end else begin

        if II <> N then
          Sprendimas := false;
        exit;

      end;

    end;
  end;

{ Išspausdinu rastą atsakymą. }
  procedure Atsakymas(Mas : TKaipKeisti; N : integer);
    var i : integer;
        f: text;
  begin
    assign (f, RF);
    rewrite (f);
    for i := 1 to N do
      write(f, Mas[i], ' ');
    close (f);
  end;

  var N : integer;
      Mas : TGrafas;
      Ats : TKaipKeisti;

begin
{ Įvedu pradinius duomenis. }
  Ivedimas(Mas, N);

{ Ieškau sprendinio. }
  if Sprendimas(Mas, N, Ats) then
    Atsakymas(Ats, N)
  else
    Negalima;
end.
