DP.f[i][j]表示花费为i, 买了j个物品的价值
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define For(i, j, k) for(int i=(j);i<=(k);i++)
#define INF (2147483647>>1)
#define Pair pair<int,int>
#define ll long long
using namespace std;
inline int read()
{
int num=0,flag=1;
char c=' ';
for(;c>'9'||c<'0';c=getchar()) if(c=='-') flag=0;
for(;c>='0'&&c<='9';num=(num<<1)+(num<<3)+c-48,c=getchar());
return flag?num:-num;
}
struct node {
int val, cost, h;
bool operator < (const node &second) const {
return val < second.val;
}
};
int n, m;
#define MAXN 105
node a[MAXN];
int f[2005][MAXN];
int ans = INT_MIN+1;
int main()
{
cin >> n >> m;
For(i, 0, m) {
For(j, 1, n) {
f[i][j] = INT_MIN;
}
}
For(i, 1, n) {
a[i].cost = read(), a[i].h = read(), a[i].val = read();
}
sort(a + 1, a + n + 1);
For(i, 1, n) {
for (int j = m; j >= a[i].cost; j--) {
For(k, 0, i-1) {
f[j][k + 1] = max(f[j][k + 1], f[j - a[i].cost][k] + a[i].h * k);
}
}
}
For(i, 1, n) {
ans = max(ans, f[m][i]);
}
cout << ans << endl;
return 0;
}