#include <bits/stdc++.h>
using namespace std;
typedef struct {
  int t, p, n;
} TPlav;
bool MoreP(TPlav p1, TPlav p2);
bool LessN(TPlav p1, TPlav p2);
bool MoreP(TPlav p1, TPlav p2) { return p1.p > p2.p; }
bool LessN(TPlav p1, TPlav p2) { return p1.n < p2.n; }
int main(void) {
  int n, v;
  vector<TPlav> p1, p2, pv;
  int ans;
  TPlav p;
  int i1, i2;
  cin >> n >> v;
  for (int i = 0; i < n; ++i) {
    cin >> p.t >> p.p;
    p.n = i + 1;
    if (p.t == 1)
      p1.push_back(p);
    else
      p2.push_back(p);
  }
  sort(p1.begin(), p1.end(), MoreP);
  sort(p2.begin(), p2.end(), MoreP);
  i1 = i2 = 0;
  ans = 0;
  while (((i1 < p1.size()) || (i2 < p2.size())) && (v > 0)) {
    if ((v == 1) && (i1 < p1.size())) {
      pv.push_back(p1[i1]);
      v -= 1;
      ans += p1[i1].p;
      ++i1;
    } else if ((v > 1) && (i1 < p1.size())) {
      if (p1[i1].p >= p2[i2].p) {
        pv.push_back(p1[i1]);
        v -= 1;
        ans += p1[i1].p;
        ++i1;
      } else if ((i1 < p1.size() - 1) &&
                 (p2[i2].p >= p1[i1].p + p1[i1 + 1].p)) {
        pv.push_back(p2[i2]);
        v -= 2;
        ans += p2[i2].p;
        ++i2;
      } else if (i1 < p1.size() - 1) {
        pv.push_back(p1[i1]);
        v -= 1;
        ans += p1[i1].p;
        ++i1;
      } else {
        pv.push_back(p2[i2]);
        v -= 2;
        ans += p2[i2].p;
        ++i2;
      }
    } else if ((v > 1) && (i2 < p2.size())) {
      pv.push_back(p2[i2]);
      v -= 2;
      ans += p2[i2].p;
      ++i2;
    } else
      v = 0;
  }
  sort(pv.begin(), pv.end(), LessN);
  cout << ans << endl;
  for (int i = 0; i < pv.size(); ++i) {
    cout << pv[i].n << " ";
  }
  return 0;
}
