#include <bits/stdc++.h>
using namespace std;
int chh;
const int N = 100005;
struct NODE {
  int w, v, id;
  bool operator<(const NODE& a) const { return w * a.v > v * a.w; }
} p[N];
int n, m;
int main() {
  int ans, k, t, u, t1, t2, x, y;
  while (~scanf("%d %d", &n, &m)) {
    for (int i = 0; i < (n); i++)
      scanf("%d %d", &p[i].v, &p[i].w), p[i].id = i + 1;
    sort(p, p + n);
    ans = 0;
    k = -1;
    for (int i = 0; i < (n); i++) {
      if (p[i].v > m) break;
      ans += p[i].w, m -= p[i].v, k = i;
    }
    if (m == 0) {
      printf("%d\n", ans);
      for (int i = 0; i < (k + 1); i++) printf("%d ", p[i].id);
    } else {
      u = -1;
      for (int i = (k + 1); i <= (n - 1); i++) {
        if (p[i].v == 1) {
          u = i;
          break;
        }
      }
      if (u != -1)
        t1 = ans + p[u].w;
      else
        t1 = -1;
      x = -1;
      for (int i = (k + 1); i <= (n - 1); i++) {
        if (p[i].v == 2) {
          x = i;
          break;
        }
      }
      if (x == -1)
        t2 = -1;
      else {
        y = -1;
        for (int i = (k); i >= (0); i--) {
          if (p[i].v == 1) {
            y = i;
            break;
          }
        }
        if (y == -1)
          t2 = -1;
        else
          t2 = ans - p[y].w + p[x].w;
      }
      if (ans >= t1 && ans >= t2) {
        printf("%d\n", ans);
        for (int i = 0; i < (k + 1); i++) printf("%d ", p[i].id);
      } else if (t1 >= ans && t1 >= t2) {
        printf("%d\n", t1);
        for (int i = 0; i < (k + 1); i++) printf("%d ", p[i].id);
        printf("%d", p[u].id);
      } else {
        printf("%d\n", t2);
        for (int i = 0; i < (k + 1); i++) {
          if (i != y) printf("%d ", p[i].id);
        }
        printf("%d", p[x].id);
      }
    }
    puts("");
  }
  return 0;
}
