#include <bits/stdc++.h>
using namespace std;
struct node {
  int v, id;
  bool operator<(node oth) const { return v > oth.v; }
} a[100001], b[100001];
int suma[100001], sumb[100001];
int na, nb, n, v;
int main() {
  scanf("%d%d", &n, &v);
  for (int i = 1; i <= n; ++i) {
    int t, p;
    scanf("%d%d", &t, &p);
    if (t == 1)
      a[++na].id = i, a[na].v = p;
    else
      b[++nb].id = i, b[nb].v = p;
  }
  sort(a + 1, a + 1 + na);
  sort(b + 1, b + 1 + nb);
  if (na == 0) {
    int ans = 0, pos;
    pos = min(nb, v / 2);
    for (int i = 1; i <= pos; ++i) ans += b[i].v;
    printf("%d\n", ans);
    for (int i = 1; i <= pos; ++i) printf("%d ", b[i].id);
  } else if (nb == 0) {
    int ans = 0, pos;
    pos = min(v, na);
    for (int i = 1; i <= pos; ++i) ans += a[i].v;
    printf("%d\n", ans);
    for (int i = 1; i <= pos; ++i) printf("%d ", a[i].id);
  } else {
    for (int i = 1; i <= na; ++i) suma[i] = suma[i - 1] + a[i].v;
    for (int i = 1; i <= nb; ++i) sumb[i] = sumb[i - 1] + b[i].v;
    int pos = min(na, v);
    int mx = 0, Na, Nb;
    for (int i = 0; i <= pos; ++i) {
      int tmp = suma[i] + sumb[min((v - i) / 2, nb)];
      if (tmp > mx) {
        mx = tmp;
        Na = i;
        Nb = min((v - i) / 2, nb);
      }
    }
    printf("%d\n", mx);
    for (int i = 1; i <= Na; ++i) printf("%d ", a[i].id);
    for (int i = 1; i <= Nb; ++i) printf("%d ", b[i].id);
  }
}
