#include <bits/stdc++.h>
using namespace std;
const int maxn = 220, mod = 1e9 + 7;
const long long inf = 1e18 + 10;
long long a[maxn], b[maxn], c[maxn];
long long mxl[maxn][maxn], mxl2[maxn][maxn], toz[maxn][maxn], toz2[maxn][maxn];
long long ans[maxn][maxn], ans2[maxn][maxn];
long long sma[maxn], smb[maxn];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie();
  long long n, t, k;
  cin >> n >> t >> k;
  for (int i = 1; i <= n; i++) {
    cin >> a[i] >> b[i] >> c[i];
    smb[i] = smb[i - 1] + b[i];
    sma[i] = sma[i - 1] + a[i];
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= t; j++) {
      ans[i][j] = inf;
      mxl[i][j] = -1;
      if (b[i] * j <= c[i] && ans[i - 1][j] != inf) {
        long long rem = smb[i - 1] * j % k;
        long long num = b[i] * j;
        if (rem != 0) rem = k - rem;
        if (rem <= num) mxl[i][j] = max(mxl[i][j], num - rem);
        ans[i][j] = min(ans[i][j], ans[i - 1][j]);
      }
      for (int w = 1; w < j; w++) {
        if (mxl[i][w] == -1) continue;
        long long num = mxl[i][w] + b[i] * (j - w);
        long long turn = 0;
        if (num > c[i]) turn = (num - c[i] + k - 1) / k;
        if (mxl[i][w] < turn * k) continue;
        num -= turn * k;
        long long num2 = mxl[i][w] - turn * k;
        if (ans[i - 1][j - w] != inf) {
          long long rem = smb[i - 1] * (j - w) % k;
          if (rem != 0) rem = k - rem;
          if (rem <= num) mxl[i][j] = max(mxl[i][j], num - rem);
          ans[i][j] =
              min(ans[i][j], ans[i - 1][j - w] + (smb[i] * w - num2) / k);
        }
      }
      if (mxl[i][j] != -1)
        ans[i][j] = min(ans[i][j], (smb[i] * j - mxl[i][j]) / k);
      if (ans[i][j] != inf)
        toz[i][j] = (smb[i] * j + k - 1) / k;
      else
        toz[i][j] = inf;
      for (int w = 1; w < j; w++)
        toz[i][j] = min(toz[i][j], toz[i][w] + toz[i][j - w]);
    }
  }
  for (int i = 1; i <= n; i++) {
    mxl2[i][0] = (k - (sma[i - 1] % k)) % k;
    if (mxl2[i][0] <= a[i])
      mxl2[i][0] = a[i] - mxl2[i][0];
    else
      mxl2[i][0] = -1;
    toz2[i][0] = (sma[i] + k - 1) / k;
    for (int j = 1; j <= t; j++) {
      ans2[i][j] = inf;
      mxl2[i][j] = -1;
      if (a[i] + b[i] * j <= c[i] && ans2[i - 1][j] != inf) {
        long long rem = (sma[i - 1] + smb[i - 1] * j) % k;
        long long num = a[i] + b[i] * j;
        if (rem != 0) rem = k - rem;
        if (rem <= num) mxl2[i][j] = max(mxl2[i][j], num - rem);
        ans2[i][j] = min(ans2[i][j], ans2[i - 1][j]);
      }
      for (int w = 0; w < j; w++) {
        if (mxl2[i][w] == -1) continue;
        long long num = mxl2[i][w] + b[i] * (j - w);
        long long turn = 0;
        if (num > c[i]) turn = (num - c[i] + k - 1) / k;
        if (mxl2[i][w] < turn * k) continue;
        num -= turn * k;
        long long num2 = mxl2[i][w] - turn * k;
        if (ans[i - 1][j - w] != inf) {
          long long rem = smb[i - 1] * (j - w) % k;
          if (rem != 0) rem = k - rem;
          if (rem <= num) mxl2[i][j] = max(mxl2[i][j], num - rem);
          ans2[i][j] = min(
              ans2[i][j], ans[i - 1][j - w] + (sma[i] + smb[i] * w - num2) / k);
        }
      }
      if (mxl2[i][j] != -1)
        ans2[i][j] = min(ans2[i][j], (sma[i] + smb[i] * j - mxl2[i][j]) / k);
      if (ans2[i][j] != inf)
        toz2[i][j] = (sma[i] + smb[i] * j + k - 1) / k;
      else
        toz2[i][j] = inf;
      for (int w = 0; w < j; w++)
        toz2[i][j] = min(toz2[i][j], toz2[i][w] + toz[i][j - w]);
    }
  }
  long long ANS = ans2[n][t];
  for (int j = 0; j <= t; j++) {
    ANS = min(ANS, toz2[n][j] + ans[n][t - j]);
  }
  return cout << ANS << endl, 0;
}
