import sys def solve(N, W, v, w): # dp_value[i][j]: i番目以降で重さjまで取りうる価値の最大値 # dp_next[i][j]: 最適解の次に取るアイテムの1-basedインデックス、なければ None dp_value = [[0] * (W + 1) for _ in range(N + 1)] dp_next = [[None] * (W + 1) for _ in range(N + 1)] # 後ろからDP for i in range(N - 1, -1, -1): wi, vi = w[i], v[i] # 重さ不足で取れない場合 for j in range(wi): dp_value[i][j] = dp_value[i + 1][j] dp_next[i][j] = dp_next[i + 1][j] # 取るか取らないかの比較 for j in range(wi, W + 1): no_take = dp_value[i + 1][j] take = dp_value[i + 1][j - wi] + vi if no_take >= take: dp_value[i][j] = no_take dp_next[i][j] = dp_next[i + 1][j] else: dp_value[i][j] = take dp_next[i][j] = i + 1 # 1-based index # トレースバックして選ばれたアイテムを列挙 ans = [] budget = W nxt = dp_next[0][W] while nxt is not None: ans.append(nxt) budget -= w[nxt - 1] nxt = dp_next[nxt][budget] return ans def main(): data = sys.stdin.read().split() it = iter(data) N = int(next(it)) W = int(next(it)) v = [int(next(it)) for _ in range(N)] w = [int(next(it)) for _ in range(N)] ans = solve(N, W, v, w) out = sys.stdout.write out(f"{len(ans)}\n") if ans: out(" ".join(map(str, ans)) + "\n") if __name__ == "__main__": main()