#include <bits/stdc++.h>
using namespace std;
struct boat {
  vector<int> number;
  int capacity;
  boat(const int &num, const int &capacity) {
    this->capacity = capacity;
    this->number.push_back(num);
  }
  boat() { this->capacity = 0; }
  void operator+=(const boat &a) {
    this->capacity += a.capacity;
    this->number.insert(this->number.end(), a.number.begin(), a.number.end());
  }
  void operator=(const boat &a) {
    this->capacity = a.capacity;
    this->number = a.number;
  }
};
struct Comporator {
  bool operator()(const boat &a, const boat &b) {
    return a.capacity < b.capacity;
  }
};
int main() {
  priority_queue<boat, vector<boat>, Comporator> a, b;
  int n, v, t, p;
  scanf("%d%d", &n, &v);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &t, &p);
    t == 1 ? a.push(boat(i, p)) : b.push(boat(i, p));
  }
  boat ans;
  if (v & 1 && !a.empty()) {
    ans += a.top();
    a.pop();
    v -= 1;
  }
  while (a.size() >= 2) {
    boat t = a.top();
    a.pop();
    t += a.top();
    a.pop();
    b.push(t);
  }
  if (b.empty() && a.empty()) {
    printf("%d\n%d\n", ans.capacity, *(ans.number).begin());
    return 0;
  } else if (b.empty()) {
    printf("%d\n%d\n", a.top().capacity, *(a.top().number).begin());
    return 0;
  }
  while (v > 2 && !b.empty()) {
    v -= 2;
    ans += b.top();
    b.pop();
  }
  if (!a.empty() && !b.empty() && v >= 2)
    ans += (a.top().capacity > b.top().capacity ? a.top() : b.top());
  else if (!a.empty() && v >= 1)
    ans += a.top();
  else if (!b.empty() && v >= 2)
    ans += b.top();
  printf("%d\n", ans.capacity);
  for (int &i : ans.number) printf("%d ", i);
  printf("\n");
  return 0;
}
