//依旧老年痴呆
//不说那么多,开始问答(口牙)
//A1:首先,我们应该怎么做呢?
//Q1: 先召唤出数组输入
//A2:那么我们应该怎么考虑呢?
//Q2:首先,应该先枚举每一种可能(即1-k)
//A3:那么你根本就过不了啊!复杂度是nm(Σk[i])欸!
//Q3:我们可以把他二进制拆分,降低复杂度到nm Σlog k[i]
//A4:那要怎么搞?
//Q4:把它拆成1,2,4,8...... 最后剩下的一个单独成一组
//嗯对,去做吧
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5;
int n,v;
int w[N],c[N],s[N];
int new_w[N],new_c[N],new_s[N];
int dp[N << 1];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> v;
for(int i = 1;i <= n;i++){
cin >> w[i] >> c[i] >> s[i];
}
int new_cnt = 0;
for(int i = 1;i <= n;i++){
if(s[i] == -1) s[i] = 1;
if(s[i] == 0) s[i] = 1 << 20;
for(int j = 1;j <= s[i];j <<= 1){
s[i] -= j;
new_w[++new_cnt] = w[i] * j;
new_c[new_cnt] = c[i] * j;
}
if(s[i]){
new_w[++new_cnt] = s[i] * w[i];
new_c[new_cnt] = s[i] * c[i];
}
}
for(int i = 1;i <= new_cnt;i++){
for(int j = v;j >= new_w[i];j--){
dp[j] = max(dp[j],dp[j - new_w[i]] + new_c[i]);
}
}
cout << dp[v] ;
return 0;
}
/**************************************************************
Problem: 1905
User: liangshinan2
Language: C++
Result: Accepted
Time:49 ms
Memory:64728 kb
****************************************************************/