#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXSTAT = 200 + 1;
const int MAXT = 200;
int nstat, tend;
long long cap;
long long init[MAXSTAT], delta[MAXSTAT], lim[MAXSTAT];
long long suminit[MAXSTAT + 1], sumdelta[MAXSTAT + 1];
long long dp[MAXSTAT + 1][MAXT + 1][2][2];
void upd(long long &a, const long long b) {
  if (b < a) a = b;
}
long long solve() {
  init[nstat] = delta[nstat] = cap, lim[nstat] = (tend + 1) * cap, ++nstat;
  suminit[0] = 0;
  for (int i = (0); i < (nstat); ++i) suminit[i + 1] = suminit[i] + init[i];
  sumdelta[0] = 0;
  for (int i = (0); i < (nstat); ++i) sumdelta[i + 1] = sumdelta[i] + delta[i];
  for (int i = (0); i <= (nstat); ++i)
    for (int j = (0); j <= (tend); ++j)
      for (int x = (0); x < (2); ++x)
        for (int y = (0); y < (2); ++y) dp[i][j][x][y] = LLONG_MAX;
  for (int j = (0); j <= (tend); ++j)
    for (int y = (0); y < (2); ++y) dp[0][j][0][y] = 0;
  for (int i = (0); i <= (nstat); ++i)
    for (int y = (0); y < (2); ++y) dp[i][0][0][y] = 0;
  for (int i = (1); i <= (nstat); ++i)
    for (int j = (1); j <= (tend); ++j)
      for (int y = (0); y < (2); ++y) {
        if (y * init[i - 1] + (j - 1) * delta[i - 1] <= lim[i - 1] &&
            dp[i - 1][j - 1][0][y] != LLONG_MAX) {
          long long have = y * init[i - 1] + (j - 1) * delta[i - 1], cost = 0;
          assert(have <= lim[i - 1]);
          long long rembefore = y * suminit[i - 1] + (j - 1) * sumdelta[i - 1] -
                                dp[i - 1][j - 1][0][y] * cap;
          assert(rembefore >= 0);
          cost += rembefore / cap + 1;
          long long now = cap * cost - rembefore;
          assert(now > 0 && now <= cap);
          if (now <= have) upd(dp[i][j][1][y], dp[i - 1][j - 1][0][y] + cost);
        }
        for (int jj = (1); jj <= (j - 1); ++jj)
          if (dp[i][jj][1][y] != LLONG_MAX &&
              dp[i - 1][j - jj][0][0] != LLONG_MAX) {
            long long have =
                y * suminit[i] + (jj - 1) * sumdelta[i] - dp[i][jj][1][y] * cap;
            assert(have >= 0 && have <= lim[i - 1]);
            long long dhave = (j - jj) * delta[i - 1], cost1 = 0;
            if (have + dhave > lim[i - 1]) {
              cost1 = (have + dhave - lim[i - 1] + cap - 1) / cap;
              if (cost1 * cap > have) continue;
              have -= cost1 * cap;
            }
            have += dhave;
            assert(have <= lim[i - 1]);
            long long rembefore =
                (j - jj) * sumdelta[i - 1] - dp[i - 1][j - jj][0][0] * cap;
            assert(rembefore >= 0);
            long long cost2 = rembefore / cap + 1;
            long long now = cap * cost2 - rembefore;
            assert(now > 0 && now <= cap);
            if (now <= have)
              upd(dp[i][j][1][y],
                  dp[i][jj][1][y] + dp[i - 1][j - jj][0][0] + cost1 + cost2);
          }
        if (y * init[i - 1] + j * delta[i - 1] <= lim[i - 1] &&
            dp[i - 1][j][0][y] != LLONG_MAX) {
          upd(dp[i][j][0][y], dp[i - 1][j][0][y]);
        }
        for (int jj = (y == 0 ? 2 : 1); jj <= (j); ++jj)
          if (dp[i][jj][1][y] != LLONG_MAX &&
              dp[i][j - jj + 1][0][0] != LLONG_MAX) {
            long long have = y * suminit[i] + (jj - 1) * sumdelta[i] -
                             dp[i][jj][1][y] * cap,
                      cost = 0;
            assert(have >= 0 && have <= lim[i - 1]);
            long long dhave = (j - jj + 1) * delta[i - 1];
            if (have + dhave > lim[i - 1]) {
              long long dcost = (have + dhave - lim[i - 1] + cap - 1) / cap;
              if (dcost * cap > have) continue;
              have -= dcost * cap, cost += dcost;
            }
            have += dhave;
            assert(have <= lim[i - 1]);
            upd(dp[i][j][0][y],
                dp[i][jj][1][y] + dp[i][j - jj + 1][0][0] + cost);
          }
      }
  return dp[nstat][tend][0][1];
}
void run() {
  scanf("%d%d%lld", &nstat, &tend, &cap);
  for (int i = (0); i < (nstat); ++i)
    scanf("%lld%lld%lld", &init[i], &delta[i], &lim[i]);
  long long ans = solve();
  printf("%lld\n", ans == LLONG_MAX ? -1 : ans);
}
int myrand() {
  return rand() % 1000 * 1000000 + rand() % 1000 * 1000 + rand() % 1001;
}
void stress() {
  for (int rep = (0); rep < (1000); ++rep) {
    nstat = 200, tend = 200, cap = myrand();
    if (cap == 0) ++cap;
    for (int i = (0); i < (nstat); ++i) {
      init[i] = myrand(), delta[i] = myrand(), lim[i] = myrand();
      if (init[i] > lim[i]) swap(init[i], lim[i]);
      if (delta[i] > lim[i]) swap(delta[i], lim[i]);
    }
    solve();
    printf(".");
  }
}
int main() {
  run();
  return 0;
}
