import collections def read_data(): N, S = map(int, input().split()) Ps = [int(input()) for n in range(N)] return N, S, Ps def solve(N, S, Ps): if N == 1: if S == Ps[0]: return [[1]] else: return [['Unexpected input data']] n0 = N // 2 n1 = N - n0 dp0 = bfs(n0, Ps[:n0], S) dp1 = bfs(n1, Ps[n0:], S) paths = [] for s0 in dp0: s1 = S - s0 if s1 in dp1: for path1 in dp1[s1]: path1x = path1 << n0 for path0 in dp0[s0]: paths.append(path0 + path1x) result = [unpack(path) for path in paths] result.sort() return result def bfs(n, Ps, S): dp = collections.defaultdict(list) dp[0].append(0) for i, p in enumerate(Ps): bit = 1 << i cumsums = list(dp.keys()) cumsums.sort(reverse=True) for cumsum in cumsums: if cumsum + p <= S: newpaths = [path + bit for path in dp[cumsum]] dp[cumsum + p].extend(newpaths) return dp def unpack(path): idx = 0 result = [] while path: idx += 1 if path & 1: result.append(idx) path >>= 1 return result if __name__ == '__main__': N, S, Ps = read_data() result = solve(N, S, Ps) for path in result: print(*path)