#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 1500010;
int n, m; ll f[maxn];
vector<pair<int, int>> G[maxn];
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> q;

void add(int u, int v, int w) {
    G[u].push_back(make_pair(v, w));
}

#define mid (l + r >> 1)
#define ls (k << 1)
#define rs (k << 1 | 1)
void build1(int k, int l, int r) {
    if (l == r) { add(l, k + n, 0); return; }
    build1(ls, l, mid), build1(rs, mid + 1, r);
    add(ls + n, k + n, 0), add(rs + n, k + n, 0);
}

void build2(int k, int l, int r) {
    if (l == r) { add(k + 5 * n, l, 0); return; }
    build2(ls, l, mid), build2(rs, mid + 1, r);
    add(k + 5 * n, ls + 5 * n, 0), add(k + 5 * n, rs + 5 * n, 0);
}

void add1(int k, int l, int r, int ql, int qr, int p) {
    if (l >= ql && r <= qr) { add(k + n, p, 0); return; }
    if (mid >= ql) add1(ls, l, mid, ql, qr, p);
    if (mid < qr) add1(rs, mid + 1, r, ql, qr, p);
}

void add2(int k, int l, int r, int ql, int qr, int p) {
    if (l >= ql && r <= qr) { add(p, k + 5 * n, 0); return; }
    if (mid >= ql) add2(ls, l, mid, ql, qr, p);
    if (mid < qr) add2(rs, mid + 1, r, ql, qr, p);
}

int main() {
    scanf("%d %d", &n, &m);
    build1(1, 1, n), build2(1, 1, n);
    int tot = 9 * n;
    for (int i = 1, l, r, c; i <= m; i++) {
        scanf("%d %d %d", &l, &r, &c);
        add1(1, 1, n, l, r, tot + 1), add2(1, 1, n, l, r, tot + 2);
        add(tot + 1, tot + 2, c), tot += 2;
    }
    memset(f, 0x3f, sizeof(f)), q.push({f[1] = 0, 1});
    while (!q.empty()) {
        auto p = q.top(); q.pop();
        if (p.first ^ f[p.second]) continue;
        for (auto nxt : G[p.second]) {
            ll nd = p.first + nxt.second;
            if (nd < f[nxt.first]) q.push({f[nxt.first] = nd, nxt.first});
        }
    }
    printf("%lld\n", f[n] > 1e18 ? 0 : f[n]);
    return 0;
}