#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
using namespace std;

struct State {
    int value;      // 总价值
    int power;      // 总功耗
    int count;      // 物品数量
    vector<int> items; // 选择的物品编号
};

// 比较函数:根据择优规则比较两个状态
bool isBetter(const State& a, const State& b) {
    // 规则2:价值高的更好
    if (a.value != b.value) {
        return a.value > b.value;
    }
    // 规则3:价值相同时,功耗小的更好
    if (a.power != b.power) {
        return a.power < b.power;
    }
    // 规则4:价值功耗都相同时,物品数量少的更好
    return a.count < b.count;
}

int main() {
    int n, K;
    cin >> n >> K;
    vector<int> c(n + 1), v(n + 1);
    
    for (int i = 1; i <= n; i++) {
        cin >> c[i] >> v[i];
    }

    // DP数组:dp[j] 表示容量为j时的最优状态
    vector<State> dp(K + 1, {0, 0, 0, {}});

    for (int i = 1; i <= n; i++) {
        // 倒序遍历,确保每个物品只选一次
        for (int j = K; j >= c[i]; j--) {
            State& current = dp[j];
            State& prev = dp[j - c[i]];
            
            // 选择当前物品后的新状态
            State new_state = {
                prev.value + v[i],
                prev.power + c[i],
                prev.count + 1,
                prev.items  // 复制之前的物品列表
            };
            new_state.items.push_back(i);  // 添加当前物品
            
            // 根据择优规则判断是否更新
            if (isBetter(new_state, current)) {
                dp[j] = new_state;
            }
        }
    }

    State result = dp[K];
    // 规则1:如果没有任何组合满足功耗预算,输出-1
    if ( result.value == 0) {
        cout << -1 << endl;
        return 0;
    }
    
    // 输出选择的物品编号(按输入顺序,即编号升序)
    sort(result.items.begin(), result.items.end());
    for (int i = 0; i < result.items.size(); i++) {
        if (i > 0) cout << " ";
        cout << result.items[i];
    }
    cout << endl;

    return 0;
}