#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LOCAL #define eprintf(...) fprintf(stderr, __VA_ARGS__) #else #define eprintf(...) 42 #endif #define rep_(i, a_, b_, a, b, ...) for (int i = (a), i##_len = (b); i < i##_len; ++i) #define rep(i, ...) rep_(i, __VA_ARGS__, __VA_ARGS__, 0, __VA_ARGS__) #define reprev_(i, a_, b_, a, b, ...) for (int i = (b-1), i##_min = (a); i >= i##_min; --i) #define reprev(i, ...) reprev_(i, __VA_ARGS__, __VA_ARGS__, 0, __VA_ARGS__) #define all(x) (x).begin(), (x).end() template bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; } template bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; } // template T gcd(T a, T b) { return b ? gcd(b, a % b) : a; } using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair P; typedef long double ld; struct stand { int x, v, w; }; const ll INF = 1e18; int main (void) { cin.tie(0); ios::sync_with_stdio(false); int n, v, l; cin >> n >> v >> l; vector a(n); for (auto &e : a) cin >> e.x >> e.v >> e.w; a.push_back({l, 0, 0}); vector> dp (n + 2, vector(v + 1)); rep (i, dp.size()) rep (j, dp[0].size()) dp[i][j] = INF; dp[0][v] = 0; rep (i, n + 1) { reprev (j, v + 1) { if (j - a[i].x + (i == 0 ? 0LL : a[i - 1].x) < 0) break; eprintf("%d %d %d\n", a[i].x, i, j); dp[i + 1][j - a[i].x + (i == 0 ? 0LL : a[i - 1].x)] = dp[i][j]; } rep (j, v + 1) { chmin(dp[i + 1][min(v, j + a[i].v)], dp[i + 1][j] + a[i].w); } } ll ans = INF; rep (i, v + 1) chmin(ans, dp[n + 1][i]); cout << (ans == INF ? -1 : ans) << '\n'; return 0; }