program vagis;
  const max_s = 100;   { maksimalus mai÷o svoris }
        max_b = 200;   { maksimalus brangenybiù skaißius }
  type lentele = array [1..max_b, 1..max_s] of
                  record
                    r  : integer;  { maksimali vertó }
                    imti : boolean; { ar imti brangenybñ }
                  end;
       duom = array [1..max_b] of integer;

  var V : lentele; { globalus kintamasis }
      sv,  { brangenybiù svoriai }
      ve : duom;  { brangenybiù vertós }
      f : text;
{----------------------------------------------------------}
function ieskoti (n, s : integer) : integer;
  { rekursinó funkcija, pildanti lentelñ V }
  var vert1, { maksimali vertó, jei neimame n-tosios brangenybós }
      vert2 : integer; { maksimali vertó, jei tÝ brangenybñ imame }
begin
  if s = 0
     then begin   { jei svoris lygus nuliui }
            ieskoti := 0;
            exit;
          end
     else if V[n, s].r <> -1  { arba jei ie÷koma reik÷mó apskaißiuota }
             then begin
                    ieskoti := V[n, s].r;
                    exit
                  end;
  { toliau nagrinójame du atvejus: }
  { 1. jei n-tosios brangenybós neimame }
  if n = 1
     then  vert1 := 0
     else  vert1 := ieskoti(n - 1, s);

  { 2. jei brangenybñ imame }
  if (sv[n] <= s)   { jÝ galime paimti, jei nevir÷ysime svorio limito }
     then if n = 1
             then vert2 := ve[n]
             else vert2 := ve[n] + ieskoti(n - 1, s - sv[n])
     else vert2 := -1;
  { pasirenkame vienÝ i÷ dviejù variantù }
  if vert1 >= vert2
     then begin
            ieskoti := vert1;
            V[n, s].r := vert1;
          end
     else begin
            ieskoti := vert2;
            V[n, s].r := vert2;
            V[n, s].imti := true;
          end;
end;
{----------------------------------------------------------}
procedure skaiciuoti (n, s : integer; var verte : integer);
  { inicializuoja lentelñ V ir kreipiasi õ rekursinñ funkcijÝ, }
  { kuri uýpildo tÝ lentelñ ir i÷ karto randa maksimaliÝ brangenybiù, }
  { kurias galima pane÷ti vertñ }
  var i, j : integer;
begin
  { pradýioje inicializuojame lentelñ }
  for i := 1 to n do
    for j := 1 to s do
        begin
          V[i, j].imti := false;
          V[i, j].r := -1
        end;
  verte := ieskoti (n, s)
end;
procedure spausdinti (n, s : integer);
  { rekursinó procedûra, spausdinanti imamù brangenybiù }
  { numerius didójimo tvarka }
begin
  if (n > 0) and (s > 0)
     then if v[n, s].imti
             then begin
                    spausdinti (n - 1, s - sv[n]);
                    write (f, n, ' ');
                  end
             else spausdinti (n - 1, s)
end;
{------------------------------------------------------}
  var n, s, i, j, verte : integer;
begin
  assign (f,'brang.dat');
  reset (f);
  readln (f, n, s);
  for i := 1 to n do
    readln (f, sv[i], ve[i]);
  close (f);

  skaiciuoti (n, s, verte);

  assign (f, 'brang.rez');
  rewrite (f);
  writeln (f, verte);
  spausdinti (n, s);
  close (f);
end.

