#include <bits/stdc++.h>
using namespace std;
struct Node {
  int m, num;
  bool operator<(const Node& a) const { return m > a.m; }
} n1[100005] = {0}, n2[100005] = {0};
int main() {
  int n, v;
  cin >> n >> v;
  int k1 = 0, k2 = 0;
  for (int i = 0; i < n; i++) {
    int num, p;
    cin >> num >> p;
    if (num == 1) {
      n1[k1].m = p;
      n1[k1++].num = i + 1;
    } else {
      n2[k2].m = p;
      n2[k2++].num = i + 1;
    }
  }
  sort(n1, n1 + k1);
  sort(n2, n2 + k2);
  int p1 = 0, p2 = 0;
  long long ans = 0;
  vector<int> path;
  if (v % 2 == 1 && k1 > 0) {
    path.push_back(n1[p1].num);
    v -= 1;
    ans += n1[p1++].m;
  }
  while (p1 < k1 && p2 < k2 && v) {
    if (n1[p1].m + n1[p1 + 1].m >= n2[p2].m) {
      path.push_back(n1[p1].num);
      path.push_back(n1[p1 + 1].num);
      v -= 2;
      ans += n1[p1].m + n1[p1 + 1].m;
      p1 += 2;
    } else {
      path.push_back(n2[p2].num);
      v -= 2;
      ans += n2[p2].m;
      p2++;
    }
  }
  if (v) {
    if (p1 >= k1 && p2 < k2 && v >= 2) {
      while (p2 < k2 && v) {
        path.push_back(n2[p2].num);
        v -= 2;
        ans += n2[p2].m;
        p2++;
      }
    } else if (p1 < k1 && p2 >= k2 && v >= 1) {
      while (p1 < k1 && v) {
        path.push_back(n1[p1].num);
        v--;
        ans += n1[p1].m;
        p1++;
      }
    }
  }
  cout << ans << endl;
  for (int i = 0; i < path.size(); i++) {
    if (i > 0)
      cout << ' ' << path[i];
    else
      cout << path[i];
  }
  cout << endl;
  return 0;
}
