#include <bits/stdc++.h>
using namespace std;
//由于要将物品拆分 
int f[2020],v[15050],w[15050];
int op = 0;
int main() {
	//二进制优化 
	//7:表示为0~7的和
	//7分为:1 1 1 1 1 1 1,将7件物品分为7种物品 
	//二进制分法:2^2+2^1+2^0
	//凑出一个整数Si的时间复杂度:log2(Si)
	
	/*
	  如果要凑一个整数10
	  理论上需要log2(10)=4个数
	  但4个数1 2 4 8,不过会多凑一些数出来
	  但其实需要的数是: 1 2 4 3就能凑出0~10
	  也就是说:2^p是<=Si 2^p+1 > Si,求出一个p
	    这个p就是需要的数的数量
		需要的最后一个数 = Si - (2^0+2^1+...+2^p) 
	*/ 
	int n,m;
	cin>>n>>m;
	//拆分物品 
	for(int i = 1;i <= n;i++){
		int v1,w1,s;
		cin>>v1>>w1>>s;
		int k = 1;//k代表2的幂 
		while(k <= s){
			v[++op] = v1 * k;
			w[op] = w1 * k; 
			s -= k;
			k *= 2;
		} 
		//如果s还有值,说明s不是正好是2的整数次方 
		if(s){
			v[++op] = v1 * s;
			w[op] = w1 * s;
		}
	}
	
	//转换为01背包
	for(int i = 1;i <= op;i++){
		for(int j = m;j >= v[i];j--){
			f[j] = max(f[j],f[j-v[i]]+w[i]); 
		}
	} 
	
	cout<<f[m];
	 
	return 0;
}

/**************************************************************
	Problem: 1889
	User: admin
	Language: C++
	Result: Accepted
	Time:38 ms
	Memory:2200 kb
****************************************************************/