#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int G = 105, N = 3005, M = 3005;
int main() {
int n, m , k;
cin >> n >> m;
long long* dp = new long long[m + 1];
memset(dp, 0, sizeof(long long) * (m + 1));
vector<vector<int> > obj_w(G + 1);
vector<vector<int> > obj_v(G + 1);
for (int i = 0; i <= G; i++) {
obj_w[i].push_back(0);
obj_v[i].push_back(0);
}
int w, v, num, max_num = -1;
for (int i = 0; i < n; i++) {
cin >> w >> v >> num;
obj_w[num].push_back(w);
obj_v[num].push_back(v);
max_num = max(max_num, num);
}
for (int i = 1; i <= max_num; i++) {
for (int j = m; j >= 0; j--) {
for (int k = 0; k < obj_w[i].size(); k++) {
if (j >= obj_w[i][k]) {
dp[j] = max(dp[j], dp[j - obj_w[i][k]] + obj_v[i][k]);
}
}
}
}
cout << dp[m] << endl;
}