program metagrama;
  { 53 u‘davinys }
  const MAX = 100; { tiek daugiausia gali b–ti ‘od‘i— }
  type zodziai = array [1..MAX] of string[20];
       lentele = array [1..MAX, 1..MAX] of boolean;

  { ‘emiau suražyti globalieji kintamieji }
    var sk : integer; { kiek duota ‘od‘i— }
        z : zodziai; { duotieji zodziai }
        ilgis,      { ilgiausios metagrandin‚s ilgis }
        kiek : integer; { sudaromos metagrandin‚s ilgis }
        met, { ilgiausia metgagrandin‚ }
        gr : zodziai; { sudaroma metagrandin‚ }
        buta : array [1.. MAX] of boolean; { ar ‘odis trauktas  metegrandinŠ }
        m : lentele; { m[i, j] = true, jei ‘od‘iai i ir j yra metagramos }


  function sudaro (zod1, zod2 : string) : boolean;
    { ar žie ‘od‘iai yra metagramos }
    var i, skirt : integer;
  begin
    if length (zod1) <> length (zod2)
       then sudaro := false
       else begin
              skirt := 0;
              for i := 1 to length (zod1) do
                 if zod1[i] <> zod2[i]
                    then skirt := skirt + 1;
              sudaro := skirt = 1;
            end;
  end; { sudaro }

  procedure eiti (i : integer);
    { rekursin‚ proced–ra, prijungianti nauj… ‘od prie metagrandin‚s, }
    { besibaigian‡ios i-tuoju ‘od‘iu }
    var eita : boolean;
        j : integer;
  begin  { eiti }
    kiek := kiek + 1;
    gr[kiek] := z[i]; { ‘odis traukiamas  metagrandinŠ }
    buta[i] := true;
    eita := false;
    for j := 1 to sk do
      if not buta[j] and (m[i, j])
         then begin
                eita := true;
                eiti (j);
              end;
    if not eita  { jei grandin‚ baig‚si }
       then if ilgis < kiek
               then begin
                      ilgis := kiek;
                      met := gr;
                    end;
    { gr‘tama per ‘ingsn atgal }
    kiek := kiek - 1;
    buta[i] := false;
  end; { eiti }

  procedure metagr;
    { iž duot— ‘od‘i— sudaro ilgiausi… metagrandinŠ }
    var i, j : integer;
  begin { metagr }
    { rasime ‘od‘ius, kurie yra metagramos tarpusavyje }
    for i := 1 to sk do
      for j := 1 to sk do
        m[i, j] := sudaro (z[i], z[j]);
    { nei vienas ‘odis netrauktas  metagrandinŠ }
    for i := 1 to sk do
      buta[i] := false;
    {  metagrandinŠ bandome traukti kiekvien… ‘od }
    ilgis := 1;   { kol kas trumpiausia metagrandin‚ sudaryta iž vieno }
    met[ilgis] := z[1]; { ‘od‘io }
    for i := 1 to sk do
       eiti (i);
  end;  { metagr }

  var f : text;
      i : integer;
begin
  assign (f, 'ZOD.DAT');
  reset (f);
  sk := 0;
  while not eof (f) do
    begin
      sk := sk + 1;
      readln (f, z[sk]);
    end;
  close (f);
  metagr;
  assign (f, 'ZOD.REZ');
  rewrite (f);
  for i := 1 to ilgis do
    writeln (f, met[i]);
  close (f);
end.