#include <bits/stdc++.h>
using namespace std;
const int nax = 1e+3, W = 1e+5;
int dp[nax][W][2];
int n, max_weight;
vector<vector<int>>a;
int dfs(int i, int j, int odd){
// If the current item is out of the list or weight that I have > W.
// Return 0 as I can't take anything.
if(i >= n || j > max_weight){
return 0;
}
int ans = 0;
if(a[i][2] == 0){
// We have a red product
// Either we can take this or reject it
// Take it
ans = max(ans, a[i][0] + dfs(i + 1, j + a[i][1], odd));
// Not take it
ans = max(ans, dfs(i + 1, j, odd));
}else{
// We have a blue product
// Either take it
ans = max(ans, a[i][0] + dfs(i + 1, j + a[i][1], (odd + 1) % 2));
// Not take it
ans = max(ans, dfs(i + 1, j + a[i][1], odd));
}
return dp[i][j][odd] = ans;
}
void test_case(){
cin >> n >> max_weight;
a = vector<vector<int>>(n, vector<int>(3));
for(int i = 0; i < n; i++){
cin >> a[i][0] >> a[i][1] >> a[i][2];
}
memset(dp, -1, sizeof(dp));
dfs(0, 0, 0);
// Now take all the maximum over all the values [i, j] where type == 0.
int ans = 0;
for(int i = 0; i < n; i++){
for(int w = 0; w <= max_weight; w++){
ans = max(ans, dp[i][w][0]);
}
}
cout << ans << "\n";
}
int main(){
int t = 1;
//cin >> t;
for(int i = 0; i < t; i++)
test_case();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbmF4ID0gMWUrMywgVyA9IDFlKzU7CmludCBkcFtuYXhdW1ddWzJdOyAKCmludCBuLCBtYXhfd2VpZ2h0Owp2ZWN0b3I8dmVjdG9yPGludD4+YTsKCgppbnQgZGZzKGludCBpLCBpbnQgaiwgaW50IG9kZCl7CiAgICAvLyBJZiB0aGUgY3VycmVudCBpdGVtIGlzIG91dCBvZiB0aGUgbGlzdCBvciB3ZWlnaHQgdGhhdCBJIGhhdmUgPiBXLgogICAgLy8gUmV0dXJuIDAgYXMgSSBjYW4ndCB0YWtlIGFueXRoaW5nLgogICAgaWYoaSA+PSBuIHx8IGogPiBtYXhfd2VpZ2h0KXsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGludCBhbnMgPSAwOwogICAgaWYoYVtpXVsyXSA9PSAwKXsKICAgICAgICAvLyBXZSBoYXZlIGEgcmVkIHByb2R1Y3QKICAgICAgICAvLyBFaXRoZXIgd2UgY2FuIHRha2UgdGhpcyBvciByZWplY3QgaXQKICAgICAgICAKICAgICAgICAvLyBUYWtlIGl0CiAgICAgICAgYW5zID0gbWF4KGFucywgYVtpXVswXSArIGRmcyhpICsgMSwgaiArIGFbaV1bMV0sIG9kZCkpOwogICAgICAgIAogICAgICAgIC8vIE5vdCB0YWtlIGl0CiAgICAgICAgYW5zID0gbWF4KGFucywgZGZzKGkgKyAxLCBqLCBvZGQpKTsKICAgIH1lbHNlewogICAgICAgIC8vIFdlIGhhdmUgYSBibHVlIHByb2R1Y3QKICAgICAgICAKICAgICAgICAvLyBFaXRoZXIgdGFrZSBpdAogICAgICAgIGFucyA9IG1heChhbnMsIGFbaV1bMF0gKyBkZnMoaSArIDEsIGogKyBhW2ldWzFdLCAob2RkICsgMSkgJSAyKSk7CiAgICAgICAgCiAgICAgICAgLy8gTm90IHRha2UgaXQKICAgICAgICBhbnMgPSBtYXgoYW5zLCBkZnMoaSArIDEsIGogKyBhW2ldWzFdLCBvZGQpKTsKICAgIH0KICAgIAogICAgcmV0dXJuIGRwW2ldW2pdW29kZF0gPSBhbnM7Cn0KCnZvaWQgdGVzdF9jYXNlKCl7CiAgICAgY2luID4+IG4gPj4gbWF4X3dlaWdodDsKICAgICBhID0gdmVjdG9yPHZlY3RvcjxpbnQ+PihuLCB2ZWN0b3I8aW50PigzKSk7CiAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgY2luID4+IGFbaV1bMF0gPj4gYVtpXVsxXSA+PiBhW2ldWzJdOyAKICAgICB9CiAgICAgbWVtc2V0KGRwLCAtMSwgc2l6ZW9mKGRwKSk7IAogICAgIGRmcygwLCAwLCAwKTsKICAgICAKICAgICAvLyBOb3cgdGFrZSBhbGwgdGhlIG1heGltdW0gb3ZlciBhbGwgdGhlIHZhbHVlcyBbaSwgal0gd2hlcmUgdHlwZSA9PSAwLiAKICAgIGludCBhbnMgPSAwOwogICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgZm9yKGludCB3ID0gMDsgdyA8PSBtYXhfd2VpZ2h0OyB3KyspewogICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBkcFtpXVt3XVswXSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBjb3V0IDw8IGFucyA8PCAiXG4iOwp9IAoKCmludCBtYWluKCl7CiAgICAKICAgIGludCB0ID0gMTsKICAgIC8vY2luID4+IHQ7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgdDsgaSsrKQogICAgICAgIHRlc3RfY2FzZSgpOwogICAgCiAgICByZXR1cm4gMDsKfSAKCgogCg==