{$M 65520,0,655360}
program gelezinkelio_groteles;

   const PR = 'GROTEL.DAT';
         RZ = 'GROTEL.REZ';
         MAX_K = 12; { maksimalus aukžtis }
         MAX_ILG = 255; { maksimalus eilut‚s ilgis }
   type eilutes = array [1..MAX_K] of string;
        lentele = array [1..MAX_K] of integer;
        aibe = set of 1..MAX_K;
        aib_mas = array [1..MAX_K] of aibe;
        log_lentele = array [1..MAX_K] of boolean;

   { ‘emiau apražyti globalieji kintamieji }
   var k: integer;    { aukžtis }
       fr: string;    { fragmentas }

  procedure sifruoti (teksto_il, nr: integer; var fr_eil: eilutes);
    { u‘žifruojamas fragmentas. Pirmoji u‘žifruota raid‚ dedama
       stulpel, kurio numeris nr. }
    var i, eilute: integer;
        zemyn: boolean;
  begin
    for i := 1 to k do
      fr_eil[i] := '';
    zemyn := true;
    eilute := 1;
    for i := 1 to teksto_il do
      begin
        if (i < nr) or (i > nr + length(fr) - 1)
           then fr_eil[eilute] := fr_eil[eilute] + chr(1)
           else fr_eil[eilute] := fr_eil[eilute] + fr[i-nr+1];
        if (eilute = 1) and (i <> 1) or (eilute = k)
           then zemyn := not zemyn;
        if zemyn
           then eilute := eilute + 1
           else eilute := eilute - 1;
      end;
  end; { žifruoti }

  procedure stumti (var fr_eil: eilutes; var pavyko: boolean);
    var i, j: integer;
  begin
    pavyko := true;
    for i := 1 to k do
      for j := 1 to 2 do
        if (j <> 2) or (i <> 1) and (i <> k)
           then begin
                  if fr_eil[i, length(fr_eil[i])] <> chr(1)
                     then pavyko := false;
                  delete (fr_eil[i], length(fr_eil[i]), 1);
                  fr_eil[i] := chr(1) + fr_eil[i];
                end;
  end; { stumti }

  procedure tinka (post: integer; fr_eil: eilutes;
                   var rasta: boolean; var eil: eilutes);
    var tiks: aib_mas;
        buvo: log_lentele;

    procedure delioti (j: integer; var rasta: boolean; var rez: eilutes);
      { rekursin‚ proced–ra, iežkanti atitikimo tarp u‘žifruoto fragmento ir
        teksto eilu‡i— }
        var i: integer;
    begin
      for i := 1 to k  do
        if not buvo[i] and (i in tiks[j]) and  not rasta
           then begin
                  buvo[i] := true;
                  rez[j] := eil[i];
                  if j = k
                     then rasta := true
                     else delioti (j+1, rasta, rez);
                  { atstatome buvusias reikžmes }
                  if not rasta
                     then buvo[i] := false;
                end;
    end; { d‚lioti }

    var i, j, m, mm: integer;
        rasta_fr, rasta_eil: aibe;
        rez: eilutes;
  begin
    { su‘inome kurios teksto eilut‚s kuriomis u‘žifruoto fragmento
      eilut‚mis gali b–ti }
    for j := 1 to k do
      tiks[j] := [];
    for j := 1 to k do
      begin
        if (j = 1) or (j = k) { fragmento eilute }
            then m := 1
            else m := post;
        while (fr_eil[j, m] = chr(1)) and (m < length(fr_eil[j])) do
          m := m + 1;
        for i := 1 to k do
          if length(eil[i]) = length(fr_eil[j])
             then begin      { ar i-oji teksto eilut‚ gali b–ti j-…j… }
                    mm := m;
                    while (fr_eil[j, mm] = eil[i, mm]) and (mm < length(eil[i])) do
                      mm := mm + 1;
                     if (fr_eil[j, mm] = chr(1)) or (fr_eil[j, mm] = eil[i, mm])
                        then tiks[j] := tiks[j] + [i];
                  end;
        { jei ka‘kuri eilutei neradome atitikmens - nutraukiame darb… }
        if tiks[j] = [] then break;
      end;
    { patikriname, ar kiekvienai eilutei rastas atitikmuo }
    rasta_fr := []; rasta_eil := [];
    for i := 1 to k do
      begin
        if tiks[i] <> [] then rasta_fr := rasta_fr + [i];
        rasta_eil := rasta_eil + tiks[i];
      end;
    { rekursižkai pabandome rasti atitikim… }
    for i := 1 to k do  { pasiruožimas rekursijai }
      buvo[i] := false;
    if (rasta_fr = [1..k]) and (rasta_eil = [1..k])
       then begin
              delioti (1, rasta, rez);
              if rasta then eil := rez;
            end
       else rasta := false;
  end; { tinka }

  procedure ieskoti (var eil: eilutes);
    { pagrindin‚ u‘davin sprend‘ianti proced–ra }
    var post, stu, i, teksto_il: integer;
        rasta, pavyko: boolean;
        fr_eil: eilutes;
  begin
    { suskai‡iuojame teksto ilg }
    teksto_il := 0;
    for i := 1 to k do
      teksto_il := teksto_il + length(eil[i]);
    rasta := false;
    stu := 1;
    sifruoti (teksto_il, stu, fr_eil);
    post := 1;
    while not rasta and (stu <= 2*k-2) do
      begin
        { patikriname, ar fragmentas tinka }
        tinka (post, fr_eil, rasta, eil);
        { u‘žifruojame fragment… }
        stumti (fr_eil, pavyko);
        if not pavyko
           then  begin
                   stu := stu + 1;
                   post := (stu-1) div k + 1;
                   sifruoti (teksto_il, stu, fr_eil);
                 end
            else post := post + 2;
      end;
  end; { iežkoti }

   procedure skaityti (var k: integer; var fr: string;
                       var eil: eilutes);
     var f: text;
         i: integer;
   begin
     assign (f, PR);
     reset (f);
     readln (f, k);
     readln (f, fr);
    for i := 1 to k do
        readln (f, eil[i]);
     close(f);
   end; { skaityti }

  procedure spausdinti (const eil: eilutes);
    var f: text;
        i: integer;
  begin
    assign (f, RZ);
    rewrite (f);
    for i := 1 to k do
      writeln (f, eil[i]);
    close (f);
  end; { spausdinti }

  var eil: eilutes;
begin
  skaityti (k, fr, eil);
  ieskoti (eil);
  spausdinti (eil);
end.
