#include <bits/stdc++.h>
using namespace std;
int DEBUG = 0;
int Min(int a, int b) { return (a < b ? a : b); }
int Max(int a, int b) { return (a > b ? a : b); }
int Abs(int a) { return (a >= 0 ? a : -a); }
void print1d(int *vec, int M, const char *str = NULL) {
  if (str != NULL) printf("%s ", str);
  for (int i = 0; i < M; i++) {
    if (i > 0) printf(" ");
    printf("%d", vec[i]);
  }
  printf("\n");
}
struct NODE {
  int cap;
  int id;
  int type;
};
int compare_NODE_comb(const void *a, const void *b) {
  NODE *x = (NODE *)a;
  NODE *y = (NODE *)b;
  if (x->cap > y->cap)
    return -1;
  else if (x->cap < y->cap)
    return +1;
  else
    return 0;
}
int main(int argc, char **argv) {
  DEBUG = (argc >= 2) ? atoi(argv[1]) : 0;
  int n, v;
  cin >> n >> v;
  NODE nodes1[n + 1], nodes2[n + 1];
  int n1 = 0, n2 = 0;
  for (int i = 1; i <= n; i++) {
    int t, p;
    cin >> t >> p;
    if (t == 1) {
      nodes1[n1].type = t;
      nodes1[n1].id = i;
      nodes1[n1].cap = p;
      n1++;
    } else {
      nodes2[n2].type = t;
      nodes2[n2].id = i;
      nodes2[n2].cap = p;
      n2++;
    }
  }
  qsort(nodes1, n1, sizeof(NODE), compare_NODE_comb);
  qsort(nodes2, n2, sizeof(NODE), compare_NODE_comb);
  if (DEBUG) {
    for (int i = 0; i < n1; i++) {
      cout << "1: " << nodes1[i].id << " " << nodes1[i].cap << endl;
    }
    for (int i = 0; i < n2; i++) {
      cout << "2: " << nodes2[i].id << " " << nodes2[i].cap << endl;
    }
  }
  int cumv = 0;
  NODE fills[n + 1];
  int nfill = 0;
  for (int i = 0; i < n2; i++) {
    if (cumv <= v - 2) {
      fills[nfill++] = nodes2[i];
      cumv += nodes2[i].type;
    }
  }
  int cur1 = 0;
  while (cur1 < n1) {
    if (cumv <= v - 1) {
      fills[nfill++] = nodes1[cur1];
      cumv += nodes1[cur1].type;
      cur1++;
    } else {
      break;
    }
  }
  int nfill0 = nfill;
  for (int i = nfill0 - 1; i >= 0; i--) {
    if (fills[i].type == 2) {
      if (cur1 + 1 <= n1 - 1 &&
          fills[i].cap < nodes1[cur1].cap + nodes1[cur1 + 1].cap) {
        fills[i] = nodes1[cur1];
        fills[nfill++] = nodes1[cur1 + 1];
        cur1 += 2;
      }
    }
  }
  int cap = 0;
  for (int i = 0; i < nfill; i++) {
    cap += fills[i].cap;
  }
  cout << cap << endl;
  for (int i = 0; i < nfill; i++) {
    if (i > 0) cout << " ";
    cout << fills[i].id;
  }
  cout << endl;
  return 0;
}
