# https://yukicoder.me/problems/no/2741 def calc_dp(W, wv): dp = [-1] * (W + 1) dp[0] = 0 for w, v in wv: new_dp = dp.copy() for w0 in range(W + 1): if dp[w0] == -1: continue if w + w0 <= W: new_v = dp[w0] + v new_dp[w + w0] = max(new_dp[w + w0], new_v) dp = new_dp return dp def main(): N, W, D = map(int, input().split()) t0_wv = [] t1_wv = [] for _ in range(N): t, w, v = map(int, input().split()) if t == 0: t0_wv.append((w, v)) else: t1_wv.append((w, v)) dp0 = calc_dp(W, t0_wv) dp1 = calc_dp(W,t1_wv) answer = 0 for w0 in range(W + 1): if dp0[w0] == -1: continue v0 = dp0[w0] for w1 in range(W + 1): if w0 + w1 > W: break if abs(w0 - w1) <= D: v1 = dp1[w1] if v1 == -1: continue ans = v0 + v1 answer = max(ans, answer) print(answer) if __name__ == "__main__": main()