#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,v;
int w[20];
int number[20];
int value[20];
int f[30];
int main()
{
scanf("%d%d", &n, &v);
memset(w, 0, sizeof(w));
memset(number, 0, sizeof(number));
memset(value, 0, sizeof(value));
memset(f, 0, sizeof(f));
for (int i = 1; i <=n; i++) {
cin >> w[i] >> number[i] >> value[i];
}
// 将完全背包转换为01背包,复杂度 O(V*∑n[i])
/*
int k = n + 1;
for (int i = 1; i <= n; i++) {
while (number[i]>1) {
w[k] = w[i];
value[k] =value[i];
k++;
number[i]--;
}
}
for (int i = 1; i <= n; i++) {
for (int j = v; j >= w[i]; j--) {
f[j] = max(f[j], f[j - w[i]] + value[i]);
}
}*/
// 采用二进制拿取,复杂度为 O(V*∑log n[i])
for (int i = 1; i <= n; i++) {
int num = min(number[i], v / w[i]);
for (int k = 1; num > 0; k*= 2) {
if (k > num) {
k = num;
}
num -= k;
for (int j = v; j >= k * w[i]; j--) {
f[j] = max(f[j], f[j - k * w[i]] + value[i] * k);
}
}
}
cout << f[v] << endl;
return 0;
}