program zodynas;
  { 125 u‘davinys }
  const MAX = 100;   { maksimalus ‘od‘i— skai‡ius }
        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 raid‘i— 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ž antr…j }
    var i, ilgis: integer;
  begin
    { rasime trumpesniojo ‘od‘io 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; { ‘od‘i— skai‡ius }
                      var zodziai: tzodziai);
  { ‘od‘iai surikiuojami naudojant Rikiavim… sukeitimu }
    var pr: prioritetai;
        keista: boolean;
        i: integer;
        tarp: zodis;
  begin
    { surasime raid‘i— prioritetus }
    rasti_prioritetus (pr);
    { rikiuosime ‘od‘ius }
    keista := true;  { ar du ‘od‘iai 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   { ‘od‘ius kei‡iame 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; { ‘od‘i— skai‡ius }
  while not eof(f) do    { skaitome ‘od‘ius ir suražome  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 ‘od‘ius suražome  byl… }
    writeln (f, zodziai[i]);
  close(f)
end.
