//依旧老年痴呆 
//不说那么多,开始问答(口牙)
//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
****************************************************************/