#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define rep(i,n) for(int i=0;i<(n);i++)
#define repp(i,n) for(int i=1;i<=n;i++)

//負の辺がない場合
typedef pair<ll,int> P;
const int MAX = 100100;
const ll INF = 1e15;
struct edge{
    int to,cost;
};
int v;
vector<vector<edge>> G(MAX);
ll d[MAX];

void dijkstra(int s){
    priority_queue<P,vector<P>,greater<P>> pq;
    rep(i,v) d[i] = INF;
    d[s]=0;
    pq.push({0,s});
    while(!pq.empty()){
        P p = pq.top(); pq.pop();
        int v = p.second;
        if(d[v]<p.first) continue;
        for(edge u:G[v]){
            if(d[u.to]>d[v]+u.cost){
                d[u.to]=(ll)d[v]+u.cost;
                pq.push({d[u.to],u.to});
            }
        }
    }
}

int main(){
    cin >> v;
    int n; cin >> n;
    rep(i,n){
        int l,r,c; cin >> l >> r >> c;
        l--; r--;
        G[l].push_back({r,c});
    }
    rep(i,v) if(i+1<n) G[i+1].push_back({i,0});
    dijkstra(0);
    if(d[v-1]<INF) cout << d[v-1];
    else cout << -1;
}
