import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Scanner;
public class knapsack {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//物品数目
int C = sc.nextInt();//最大重量
int[] wei = new int[n];//每一个物品的重量
int[] val = new int[n];//每一个物品的价值
for (int i = 0; i < n; i++) {
wei[i] = sc.nextInt();
val[i] = sc.nextInt();
}
ArrayList<Integer> goods = knapsack(wei, val, n, C);
for (int i : goods) {
System.out.print(i);
System.out.print(" ");
}
}
public static ArrayList<Integer> knapsack(int[] wei, int[] val, int n, int C) {
ArrayList<Integer> list = new ArrayList<Integer>();
int[][] V = new int[n+1][C+1];//V为价值数组,有n个物品,最大重量为C
//0行和0列填充
for(int i = 0; i <= n; i++) {
V[i][0] = 0;
}
for (int j = 0; j <= C; j++) {
V[0][j] = 0;
}
//每一行开始填充
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= C; j++){
//当前重量大于j,则选择不放入
if (j < wei[i-1]) {
V[i][j] = V[i-1][j];
}
//当前重量小于j,则进行判断,加入后,是否价值增加
else {
V[i][j] = Math.max(V[i-1][j], V[i-1][j-wei[i-1]] + val[i-1]);
}
}
}
//返回最大价值
//return V[n][C];
//返回最大价值的方式
int i = n;
int j = C;
while(i > 0) {
if (V[i][j] > V[i-1][j]) {
list.add(i);
j -= wei[i-1];
}
i--;
}
return list;
}
//利用一维数组处理0-1背包问题
public static int knapsack1(int[] wei, int[] val, int n, int C) {
int[] V = new int[C+1];
for (int i = 1; i <= n; i++) {
for (int j = C; j >= 1; j--) {//逆向计算
if (j > wei[i-1]) {
V[j] = Math.max(V[j], V[j-wei[i-1]] + val[i-1]);
}
else{
break;//跳出内部循环,推理下一个物品
}
}
}
return V[C];
}