#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int M = 2e5 + 1;
const int N = 201;
int V,n;
int dp[M];
struct Bag {
int v,w,m;
}t[N];
int main()
{
scanf("%d%d",&n,&V);
for(int i=1,v,w,m;i<=n;i++)
{
scanf("%d%d%d",&v,&w,&m);
if(m==-1) m=V/v;
t[i].v=v,t[i].w=w,t[i].m=m;
}
for(int i=1,mi,vi,wi;i<=n;i++)
{
mi=t[i].m,vi=t[i].v,wi=t[i].w;
for(int k=1;k<=mi;k++)
for(int j=V;j>=k*vi;j--)
dp[j]=max(dp[j],dp[j-k*vi]+k*wi);
}
printf("%d",dp[V]);
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int M = 2e5 + 1;
const int N = 201;
int V,n;
int dp[M];
inline void zeroonebag(int v,int w) {
for(int i=V;i>=v;i--)
dp[i]=max(dp[i],dp[i-v]+w);
}
inline void completebag(int v,int w) {
for(int i=v;i<=V;i++)
dp[i]=max(dp[i],dp[i-v]+w);
}
inline void multibag(int v,int w,int m) {
if(v*m>=V) {
completebag(v,w);
return;
}
int k=1;
while(k<=m)
{
zeroonebag(k*v,k*w);
m-=k;
k<<=1;///等价于*2
}
zeroonebag(m*v,m*w);
}
int main()
{
scanf("%d%d",&n,&V);
for(int i=1,v,w,m;i<=n;i++)
{
scanf("%d%d%d",&v,&w,&m);
if(m==1)
zeroonebag(v,w);
else
if(m==-1)
completebag(v,w);
else
multibag(v,w,m);
}
printf("%d",dp[V]);
return 0;
}