#include <bits/stdc++.h>
using namespace std;
const int N=1010,M=10000;
int a[M],b[M],c[M];//体积、价值、类型
int f[N];
int main(){
int n,m,v,w,s;
cin>>n>>m;
int num=1;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&v,&w,&s);
if(s==0){//完全背包
a[num]=v;
b[num]=w;
c[num++]=0;//背包类型
}else{
if(s==-1){
s=1;
}
int j=1;
int k=1;
while(s>=k){
a[num]=k*v;
b[num]=k*w;
c[num++]=1;
s-=k;
k<<=1;
}
if(s){
a[num]=s*v;
b[num]=s*w;
c[num++]=1;
}
}
}
for(int i=1;i<num;i++){
if(c[i]==1){
for(int j=m;j>=a[i];j--){
f[j]=max(f[j],f[j-a[i]]+b[i]);
}
}else{
for(int j=a[i];j<=m;j++){
f[j]=max(f[j],f[j-a[i]]+b[i]);
}
}
}
cout<<f[m];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int f[1010],g[1010];
int n,m;
int q[1010];
void ZeroOnePack(int v,int w){
for(int j=m;j>=v;j--){
f[j]=max(f[j],f[j-v]+w);
}
}
void CompletePack(int v,int w){
for(int j=v;j<=m;j++){
f[j]=max(f[j],f[j-v]+w);
}
}
void MultiplePack(int v,int w,int s){
memcpy(g,f,sizeof(f));
for(int j=0;j<v;j++){
int h=1,t=0;
for(int k=j;k<=m;k+=v){
while(h<=t&&g[k]>g[q[t]]+(k-q[t])/v*w)t--;
q[++t]=k;
if(q[h]<k-s*v)h++;
if(h<=t)f[k]=max(g[k],g[q[h]]+(k-q[h])/v*w);
}
}
}
int main(){
int v,w,s;
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d %d %d",&v,&w,&s);
if(s==-1){
ZeroOnePack(v,w);
}else if(s==0){
CompletePack(v,w);
}else{
MultiplePack(v,w,s);
}
}
cout<<f[m];
return 0;
}