program maiselis_su_monetomis;

  const MAX_M = 500;   { maksimalus monetų skaičius }
        MAX_SV = 1000; { maksimalus maišelio svoris }
        PR = 'monetos.dat';
        RZ = 'monetos.rez';

  type moneta = record
                  verte, svoris : longint;
                end;
       monetos = array [1..MAX_M] of moneta;
       maiselis = array [0..MAX_SV] of record
                                         min_v, max_v: longint;
                                       end;

  { žemiau aprašyti globalieji kintamieji }
  var svoris: longint; { duotojo maišelio svoris }
      m: longint;      { skirtingų monetų skaičius }
      mn: monetos;  { monetų svorių ir verčių lentelė }
      mais: maiselis;
      min_v, max_v: longint;

  procedure opt_vertes (var min_v, max_v: longint);
     var i, sv, n_svoris, n_min_v, n_max_v: longint;
  begin
    mais[0].min_v := 0;  { užpildome lentelę -1 }
    mais[0].max_v := 0;
    for sv := 1 to svoris do
      begin
        mais[sv].min_v := -1;
        mais[sv].max_v := -1;
      end;
    for sv := 0 to svoris-1 do { nagrinėsime visų svorių maišelius }
      if (mais[sv].min_v >= 0)
         then { radome lengviausią neišnagrinėtą maišelį, kurio
                optimalios vertės žinomos }
           for i := 1 to m do { kiekvieną monetą bandysime dėti į maišelį }
             if sv + mn[i].svoris <= svoris
                then begin
                       n_svoris := sv + mn[i].svoris;
                       n_min_v := mais[sv].min_v + mn[i].verte;
                       n_max_v := mais[sv].max_v + mn[i].verte;
                       if (n_min_v < mais[n_svoris].min_v) or
                          (mais[n_svoris].min_v = -1)
                          then mais[n_svoris].min_v := n_min_v;
                       if n_max_v > mais[n_svoris].max_v
                          then mais[n_svoris].max_v := n_max_v;
                     end;
    min_v := mais[svoris].min_v;
    max_v := mais[svoris].max_v;
  end; { opt_vertės }

  procedure skaityti (var svoris, m: longint; var mn: monetos);
  { skaitomi pradiniai duomenys }
    var f: text;
        i: longint;
  begin
    assign (f, PR);
    reset (f);
    readln (f, svoris, m);
    for i := 1 to m do
      readln (f, mn[i].verte, mn[i].svoris);
    close (f);
  end; { skaityti }

  procedure rasyti (var min_v, max_v: longint);
  { rezultatų išvedimas }
    var f: text;
  begin
    assign (f, RZ);
    rewrite (f);
    if (min_v = -1)
       then writeln (f, -1)
       else writeln (f, min_v, ' ', max_v);
    close (f);
  end; { rašyti }

begin
  skaityti (svoris, m, mn);
  opt_vertes (min_v, max_v);
  rasyti (min_v, max_v);
end.

