program zodynas;
  { 125 udavinys }
  const MAX = 100;   { maksimalus odi skaiius }
        ILG = 20;    { ilgiausias odis }
  type  zodis = string [ILG];
        tzodziai = array [1..MAX] of zodis;
        prioritetai = array [char] of integer;

  procedure rasti_prioritetus (var pr: prioritetai);
  { randa raidi prioritetus }
  begin
    pr['A']:=1;   pr['']:=1;
    pr['B']:=2;   pr['C']:=3;   pr['']:=4;
    pr['D']:=5;
    pr['E']:=6;   pr['']:=6;   pr['']:=6;
    pr['F']:=7;   pr['G']:=8;   pr['H']:=9;
    pr['I']:=10;  pr['']:=10;  pr['Y']:=10;
    pr['J']:=11;  pr['K']:=12;  pr['L']:=13;
    pr['M']:=14;  pr['N']:=15;  pr['O']:=16;
    pr['P']:=17;  pr['R']:=18;  pr['S']:=19;
    pr['']:=20;  pr['T']:=21;
    pr['U']:=22;  pr['']:=22;  pr['']:=22;
    pr['V']:=23;  pr['Z']:=24;  pr['']:=25;
  end; { rasti_prioritetus }

  function pries (zod1, zod2: zodis; pr: prioritetai): boolean;
  { patikrina, ar pirmasis odis turi eiti prie antrj }
    var i, ilgis: integer;
  begin
    { rasime trumpesniojo odio ilg }
    if length(zod1) <= length(zod2)
       then ilgis := length(zod1)
       else ilgis := length(zod2);
    i := 1;
    while (pr[zod1[i]] = pr[zod2[i]]) and (i < ILGIS) do
      i := i + 1;
    pries := (pr[zod1[i]] < pr[zod2[i]]) or
             (pr[zod1[i]] = pr[zod2[i]]) and (length(zod1) < length(zod2));
  end; { prie }

  procedure rikiuoti (kiek: integer; { odi skaiius }
                      var zodziai: tzodziai);
  { odiai surikiuojami naudojant Rikiavim sukeitimu }
    var pr: prioritetai;
        keista: boolean;
        i: integer;
        tarp: zodis;
  begin
    { surasime raidi prioritetus }
    rasti_prioritetus (pr);
    { rikiuosime odius }
    keista := true;  { ar du odiai sukeisti vietomis }
    while keista do  { pradedama rikiuoti }
      begin
        keista := false;
        for i := 1 to kiek - 1 do
          if pries (zodziai[i+1], zodziai[i], pr)
             { jei (i+1)-as odis eina prie i-j }
             then begin   { odius keiiame vietomis }
                     keista := true;
                     tarp := zodziai[i];
                     zodziai[i] := zodziai[i + 1];
                     zodziai[i + 1] := tarp
                   end
      end;
  end; { rikiuoti }

  var f: text;
      i, kiek: integer;
      zodziai: tzodziai;
begin
  assign (f, 'ZODYN.DAT');
  reset(f);
  kiek := 0; { odi skaiius }
  while not eof(f) do    { skaitome odius ir suraome  masyv }
    begin
      kiek := kiek + 1;
      readln (f, zodziai[kiek])
    end;
  close(f);
  rikiuoti (kiek, zodziai);
  assign (f, 'ZODYN.REZ');
  rewrite (f);
  for i := 1 to kiek do     { surikiuotus odius suraome  byl }
    writeln (f, zodziai[i]);
  close(f)
end.
