/*
输入
定义2个数组存价值,各个种类物品使用数量 
遍历n次背包内存
 	每次更新另一数组使用数
	 f[i][j]=max(f[i-1][j]max(f[i][j-1],f[i][j-vi]+wi) 
*/






#include<bits/stdc++.h>
using namespace std;
int n,m,v[1001],w[1001],s[1001],f[1001][1001],e[1001][3];
int main(){
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++)scanf("%d%d%d",&v[i],&w[i],&s[i]);
	for(int i=1;i<m;i++){
		for(int j=i+1;j<=m;j++){
			if(v[i]>v[j]){
				swap(v[i],v[j]);
				swap(w[i],w[j]);
				swap(s[i],s[j]);
			}
		}
	}
	for(int i=1;i<=m;i++){
		if(s[i]<0)e[i][1]=1;
		else if(s[i]==0)e[i][1]=-1;
		else e[i][1]=s[i];
	}
	for(int i=1;i<=n;i++){
		if(e[i][2]==e[i][1])f[1][i]=f[1][i-1];
		else if(i>=v[1]*f[1][i-1]/w[1]+v[1]){
			f[1][i]=f[1][i-1]+w[1];
			e[i][2]++;
		}
	}
	for(int i=2;i<=m;i++){
		for(int j=1;j<=n;j++){
			f[i][j]=max(f[i][j-1],f[i-1][j]);
			if(i>=s[i]&&f[i][j-v[i]]+w[i]>f[i][j]&&e[i][2]!=e[i][1]){
				e[i][2]++;
				f[i][j]=f[i][j-v[i]]+w[i];
			}
		}
	}
	printf("%d",f[m][n]);
	return 0;
}
/**************************************************************
	Problem: 1905
	User: chenshuo
	Language: C++
	Result: Wrong Answer
****************************************************************/