#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 1000000000000000000
int n;
vector<ll> tr, lz;
void relax(int v, int l, int r){
tr[v] += lz[v];
if (l != r){
lz[v * 2] += lz[v], lz[v * 2 + 1] += lz[v];
}
lz[v] = 0;
}
void updater(int v, int l, int r, int ql, int qr,ll val){
relax(v, l, r);
if (l > qr || r < ql) return;
if (ql <= l && r <= qr){
lz[v] += val;
relax(v, l, r);
return;
}
int mid = (l + r) / 2;
updater(v * 2, l, mid, ql, qr, val);
updater(v * 2 + 1, mid + 1, r, ql, qr, val);
tr[v] = min(tr[v * 2], tr[v * 2 + 1]);
}
void updatep(int v, int l, int r, int pos, ll val){
relax(v, l, r);
if (l == r){
tr[v] = min(val, tr[v]);
return;
}
int mid = (l + r) / 2;
if (pos <= mid){
updatep(v * 2, l, mid, pos, val);
relax(v * 2 + 1, mid + 1, r);
}
else{
updatep(v * 2 + 1, mid + 1, r, pos, val);
relax(v * 2, l, mid);
}
tr[v] = min(tr[v * 2], tr[v * 2 + 1]);
}
ll query(int v, int l, int r, int ql, int qr){
relax(v, l, r);
if (l > qr || r < ql) return INF;
if (ql <= l && r <= qr) return tr[v];
int mid = (l + r) / 2;
return min(query(v * 2, l, mid, ql, qr), query(v * 2 + 1, mid + 1, r, ql, qr));
}
int main(){
ll m, k, l, r, c;
cin>>n>>m>>k;
vector<vector<ll>> ra;
for (int i = 1; i <= m; i++){
cin>>l>>r>>c;
ra.push_back({r, l, c, i});
}
ra.push_back({1, 1, 0, 0});
m++;
sort(ra.begin(), ra.end());
vector<vector<ll>> dp(m + 1, vector<ll>(k + 1, INF));
dp[0][0] = 0;
for (int i = 1; i <= k; i++){
tr.assign(4 * n + 4, INF), lz.assign(4 * n + 4, 0);
for (auto &el : ra){
int ind = el[3];
dp[ind][i] = query(1, 1, n, 1, el[1]);
updatep(1, 1, n, el[0], dp[ind][i - 1]);
updater(1, 1, n, 1, el[1], el[2]);
}
}
ll ans = INF;
for (int i = 0; i < m; i++){
ll co = 0;
for (int j = i + 1; j < m; j++){
if (ra[i][0] <= ra[j][1]) co += ra[j][2];
}
for (int j = 0; j <= k; j++){
ans = min(ans, dp[ra[i][3]][j] + co);
}
}
cout<<ans;
}