#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
#define mem(f, x) memset(f,x,sizeof(f))
#define sca(x) scanf("%d", &x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x);
#define pri(x) printf("%d\n", x)
#define prl(x) printf("%lld\n",x);
#define ll long long
int n,m;
const int inf=1e9;
struct good{
int v,w;
};
vector<good> goods;
int f[11111];
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
int v,w,s;
cin>>v>>w>>s;
for(int k=1;k<=s;k++){
s-=k;
goods.push_back({v*k,w*k});
}
if(s>0)
goods.push_back({s*v,s*w});
}
for(int i=0;i<goods.size();i++){
for(int j=m;j>=goods[i].v;j--){
f[j]=max(f[j],f[j-goods[i].v]+goods[i].w);
}
}
cout<<f[m]<<endl;
return 0;
}