#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
using namespace std;
int maximizeCombatPower(int n, int w, vector<tuple<int, int, int>> &demons) {
// 初始化动态规划数组,dp[j]表示使用j次变化可以达到的最大战斗力
vector<int> dp(w + 1, 0);
// 遍历每个妖精
for (const auto &[a, b, c] : demons) {
// 逆序遍历dp数组,避免重复使用当前妖精
for (int j = w; j >= b; --j) {
dp[j] = max(dp[j], dp[j - b] + c);
}
}
// 返回使用最多w次变化时的最大战斗力
return *max_element(dp.begin(), dp.end());
}
int main() {
int n, w;
cin >> n >> w;
vector<tuple<int, int, int>> demons(n);
for (int i = 0; i < n; ++i) {
int a, b, c;
cin >> a >> b >> c;
demons[i] = make_tuple(a, b, c);
}
int result = maximizeCombatPower(n, w, demons);
cout << result << endl;
return 0;
}