#include using namespace std; #define rep(i, n) for(int(i) = 0; (i) < (n); (i)++) #define FOR(i, m, n) for(int(i) = (m); (i) < (n); (i)++) #define All(v) (v).begin(), (v).end() #define pb push_back #define MP(a, b) make_pair((a), (b)) template vector make_vec(size_t a, T val) { return vector(a, val); } template auto make_vec(size_t a, Ts... ts) { return vector(a, make_vec(ts...)); } using ll = long long; using pii = pair; using pll = pair; using Graph = vector>; template struct edge { int to; T cost; edge(int t, T c) : to(t), cost(c) {} }; template using WGraph = vector>>; const int INF = 1 << 30; const ll LINF = 1LL << 60; const int MOD = 1e9 + 7; int main() { ll N, V, L; cin >> N >> V >> L; vector x(N + 2), v(N + 2), w(N + 2); x[0] = 0; v[0] = 0; w[0] = 0; int last = 0; rep(i, N) { cin >> x[i + 1] >> v[i + 1] >> w[i + 1]; } x[N + 1] = L; v[N + 1] = 0; w[N + 1] = 0; N = N + 2; auto dp = make_vec(N + 1, V + 1, (ll)INF); dp[0][V] = 0; // dp[i][j]:=iにいてガソリンがjのときの費用 for(int i = 0; i < N - 1; i++) { int cost = x[i + 1] - x[i]; for(int j = V; j >= 0; j--) { if(j - cost >= 0) dp[i + 1][j - cost] = min(dp[i + 1][j - cost], dp[i][j]); } for(int j = V; j >= 0; j--) { dp[i + 1][min(V, j + v[i + 1])] = min(dp[i + 1][min(V, j + v[i + 1])], dp[i + 1][j] + w[i + 1]); } for(int j = V - 1; j >= 0; j--) { dp[i + 1][j] = min(dp[i + 1][j], dp[i + 1][j + 1]); } } ll res = INF; rep(i, V + 1) { res = min(res, dp[N - 1][i]); } cout << (res == INF ? -1 : res) << endl; }