#include <bits/stdc++.h>
using namespace std;
void err() { cout << endl; }
template <class T, class... Ts>
void err(const T &arg, const Ts &...args) {
  cout << arg << ' ';
  err(args...);
}
inline int rd() {
  int s = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
  return s * w;
}
const int inf = 0x3f3f3f3f;
const int maxn = 1e5 + 10;
struct node {
  int id, v, w;
  bool friend operator<(const node &A, const node &B) { return A.w > B.w; }
} l1[maxn], l2[maxn];
int n, V;
int vis[maxn];
int sum = 0, k1 = 1, k2 = 1;
void gao1() {
  V--;
  sum += l1[k1].w;
  vis[l1[k1++].id] = 1;
}
void gao2() {
  V -= 2;
  sum += l2[k2].w;
  vis[l2[k2++].id] = 1;
}
void run() {
  n = rd(), V = rd();
  int c1 = 0, c2 = 0;
  for (int i = 1; i <= n; ++i) {
    int v = rd(), w = rd();
    if (v == 1)
      l1[++c1] = {i, v, w};
    else
      l2[++c2] = {i, v, w};
  }
  if (c1) sort(l1 + 1, l1 + c1 + 1);
  if (c2) sort(l2 + 1, l2 + c2 + 1);
  while (k1 <= c1 && k2 <= c2 && V) {
    if (l1[k1].w * 2 >= l2[k2].w)
      gao1();
    else {
      if (V >= 2)
        gao2();
      else if (l2[k2].w > l1[k1 - 1].w && k1 > 1) {
        V = 0;
        vis[l1[--k1].id] = 0;
        vis[l2[k2].id] = 1;
        sum += l2[k2].w - l1[k1].w;
      } else
        break;
    }
  }
  while (k1 <= c1 && V) gao1();
  while (k2 <= c2 && V) {
    if (V >= 2)
      gao2();
    else if (l2[k2].w > l1[k1 - 1].w && k1 > 1) {
      V = 0;
      vis[l1[--k1].id] = 0;
      vis[l2[k2].id] = 1;
      sum += l2[k2].w - l1[k1].w;
    } else
      break;
  }
  printf("%d\n", sum);
  for (int i = 1; i <= n; ++i)
    if (vis[i]) printf("%d ", i);
}
int main() {
  int _ = 1;
  while (_--) run();
  return 0;
}
