#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
struct P {
  long long a, t, id, xx;
  bool operator<(const P& r) const {
    if (a != r.a) return a > r.a;
    return t > r.t;
  }
} p[N];
struct SegTree {
  long long tree[N * 4 + 5];
  void pushup(int t) { tree[t] = tree[t << 1] + tree[t << 1 | 1]; }
  void build(int t, int l, int r) {
    if (l == r) {
      tree[t] = 0;
      return;
    }
    int mid = l + r >> 1;
    build(t << 1, l, mid);
    build(t << 1 | 1, mid + 1, r);
    pushup(t);
  }
  void update(int t, int l, int r, int p, long long v) {
    if (l == r) {
      tree[t] = v;
      return;
    }
    int mid = l + r >> 1;
    if (p <= mid)
      update(t << 1, l, mid, p, v);
    else
      update(t << 1 | 1, mid + 1, r, p, v);
    pushup(t);
  }
  long long query(int t, int l, int r, int a, int b) {
    if (a == l && b == r) return tree[t];
    int mid = l + r >> 1;
    if (b <= mid)
      return query(t << 1, l, mid, a, b);
    else if (a > mid)
      return query(t << 1 | 1, mid + 1, r, a, b);
    else
      return query(t << 1, l, mid, a, mid) +
             query(t << 1 | 1, mid + 1, r, mid + 1, b);
  }
} seg, cnt;
bool cmp1(const P& p1, const P& p2) {
  if (p1.t != p2.t) return p1.t < p2.t;
  return p1.a < p2.a;
}
priority_queue<P> Q, R;
int flag[N];
long long n, T;
int main() {
  scanf("%lld%lld", &n, &T);
  for (int i = 1; i < n + 1; i++)
    scanf("%lld%lld", &p[i].a, &p[i].t), p[i].xx = i;
  sort(p + 1, p + 1 + n, cmp1);
  for (int i = 1; i < n + 1; i++) p[i].id = i;
  seg.build(1, 1, n);
  cnt.build(1, 1, n);
  for (int i = 1; i < n + 1; i++) {
    seg.update(1, 1, n, i, p[i].t);
    cnt.update(1, 1, n, i, 1);
  }
  while (!Q.empty()) Q.pop();
  for (int i = 1; i < n + 1; i++) Q.push(p[i]);
  int ansk = 0;
  for (int k = 1; k < n + 1; k++) {
    while (!Q.empty()) {
      auto tmp = Q.top();
      if (tmp.a < k) {
        Q.pop();
        seg.update(1, 1, n, tmp.id, 0);
        cnt.update(1, 1, n, tmp.id, 0);
      } else {
        break;
      }
    }
    if (cnt.query(1, 1, n, 1, n) < k) break;
    int l = 1, r = n, mid;
    while (l < r) {
      mid = l + r >> 1;
      if (cnt.query(1, 1, n, 1, mid) < k)
        l = mid + 1;
      else
        r = mid;
    }
    if (seg.query(1, 1, n, 1, l) <= T)
      ansk = k;
    else
      break;
  }
  seg.build(1, 1, n);
  cnt.build(1, 1, n);
  for (int i = 1; i < n + 1; i++) {
    seg.update(1, 1, n, i, p[i].t);
    cnt.update(1, 1, n, i, 1);
  }
  while (!R.empty()) R.pop();
  for (int i = 1; i < n + 1; i++) R.push(p[i]);
  for (int k = 1; k < ansk + 1; k++) {
    while (!R.empty()) {
      auto tmp = R.top();
      if (tmp.a < k) {
        R.pop();
        seg.update(1, 1, n, tmp.id, 0);
        cnt.update(1, 1, n, tmp.id, 0);
        flag[tmp.id] = 1;
      } else {
        break;
      }
    }
  }
  printf("%d\n%d\n", ansk, ansk);
  for (int i = 1; i < n + 1; i++) {
    if (ansk <= 0) break;
    if (!flag[i]) printf("%d ", p[i].xx), ansk--;
  }
  return 0;
}
