#include <iostream>
#include <vector>
#include <deque>

using namespace std;

int main()
{
  int n, W;
  cin >> n >> W;
  int v, w, m;
  vector<int> dp(W + 1), dup(W + 1);
  deque<int> deq;
  for (int i = 0; i < n; i++)
  {
    cin >> v >> w >> m;
    dup = dp;
    
    for (int j = 0; j < w; j++)
    {
      deq.clear();
      for (int k = 0; w * k + j <= W; k++)
      {
	if (!deq.empty() && k - deq.front() > m)
	  deq.pop_front();

	while (!deq.empty() && dup[w * deq.back() + j] + (k - deq.back()) * v <= dup[w * k + j] )
	{
	  deq.pop_back();
	}
	deq.push_back(k);
	
	dp[w * k + j] = dup[w * deq.front() + j] + v * (k - deq.front());
      }
    }
  }

  cout << dp[W] << endl;
  
  return 0;
}
