#include <bits/stdc++.h>
using namespace std;
#define int long long
using ll = long long;
const int N = 110000;
const int INF = (int)(1e18);
int n, m, L[N], R[N], C[N];
vector<array<int, 3>> inp;
array<int, 2> f[N];
vector<array<int, 2>> g;
array<int, 2> vv[4 * N];
int lz[4 * N];
void build(int v, int l, int r) {
vv[v] = {-INF, -INF};
lz[v] = 0;
if (l == r) return;
int mid = (l + r) / 2;
build(v * 2 + 0, l, mid);
build(v * 2 + 1, mid + 1, r);
}
void push(int v, int l, int r) {
if (lz[v] == 0) return;
vv[v][0] += lz[v];
max(vv[v][0], -INF);
if (l != r) {
lz[v * 2 + 0] += lz[v];
lz[v * 2 + 1] += lz[v];
}
lz[v] = 0;
}
array<int, 2> get(int v, int l, int r, int ql, int qr) {
push(v, l, r);
if (ql <= l && r <= qr) return vv[v];
if (qr < l || r < ql) return {-INF, -INF};
int mid = (l + r) / 2;
return max(get(v * 2 + 0, l, mid, ql, qr), get(v * 2 + 1, mid + 1, r, ql, qr));
}
void upd(int v, int l, int r, int ql, int qr, int x) {
push(v, l, r);
if (ql <= l && r <= qr) {
lz[v] += x;
push(v, l, r);
return;
}
if (qr < l || r < ql) return;
int mid = (l + r) / 2;
upd(v * 2 + 0, l, mid, ql, qr, x);
upd(v * 2 + 1, mid + 1, r, ql, qr, x);
vv[v] = max(vv[v * 2 + 0], vv[v * 2 + 1]);
}
void upd(int v, int l, int r, int k, array<int, 2> &x) {
push(v, l, r);
if (l == r) {
vv[v] = x;
return;
}
int mid = (l + r) / 2;
if (k <= mid) upd(v * 2 + 0, l, mid, k, x);
else upd(v * 2 + 1, mid + 1, r, k, x);
vv[v] = max(vv[v * 2 + 0], vv[v * 2 + 1]);
}
array<int, 2> solve(int k) {
f[0] = {0, 0};
build(1, 0, m);
upd(1, 0, m, 0, f[0]);
int ptr = 0;
for (int i = 1; i <= m; i++) {
upd(1, 0, m, 0, i - 1, C[i]);
while (ptr < (int) g.size() && g[ptr][0] < L[i]) {
upd(1, 0, m, 0, g[ptr][1] - 1, -C[g[ptr][1]]);
ptr++;
}
f[i] = get(1, 0, m, 0, i - 1);
f[i][0] -= k;
f[i][0] = max(f[i][0], -INF);
f[i][1] += 1;
upd(1, 0, m, i, f[i]);
}
return f[m];
}
int32_t main() {
ios::sync_with_stdio(0); cin.tie(0);
int k; ll tn, tm, tk; cin >> tn >> tm >> tk;
n = tn;
m = tm;
k = tk;
for (int i = 1; i <= m; i++) {
int l, r, c; ll tl, tr, tc; cin >> tl >> tr >> tc;
l = tl;
r = tr;
c = tc;
inp.push_back({l, r - 1, c});
}
sort(begin(inp), end(inp));
for (int i = 1; i <= m; i++) {
L[i] = inp[i - 1][0];
R[i] = inp[i - 1][1];
C[i] = inp[i - 1][2];
}
m++; k++;
L[m] = R[m] = n;
C[m] = 0;
for (int i = 1; i <= m; i++)
g.push_back({R[i], i});
sort(begin(g), end(g));
if (k > solve(1)[1]) {
cout << 0;
return 0;
}
int tl = 0, tr = (int)(1e15);
while (tr - tl > 1) {
int tm = (tl + tr) / 2;
array<int, 2> res = solve(tm);
if (res[1] > k) tl = tm;
else tr = tm;
}
array<int, 2> res = solve(tr);
cout << (ll) (accumulate(C + 1, C + 1 + n, (int) 0ll) - (res[0] - k + res[1] + tr * k));
}