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

typedef long long ll;
typedef pair<ll,ll> P;

static const int MAX=100100;
static const ll INF=1e15;

ll d[MAX];

struct edge{
    int to,cost;
};

vector<edge> g[MAX];

void daijkstra(int s){
    priority_queue<P,vector<P>,greater<P> > que; //小さいものから取り出す
    fill(d,d+MAX,INF);
    que.push(P(0,s));
    d[s]=0;
    while(!que.empty()){
        P p=que.top(); que.pop();
        int v=p.second;
        if(d[v]<p.first) continue;
        for(int i=0;i<g[v].size();i++){
            edge e=g[v][i];
            if(d[e.to]>d[v]+e.cost){
                d[e.to]=d[v]+e.cost; //よりコストの小さい辺があれば張りなおす
                que.push(P(d[e.to],e.to));
            }
        }
    }
}

//g[a].push_back(edge{b,c}); //入力例
//g[b].push_back(edge{a,c});

int main(){
    int N,M; cin >> N >> M;
    for(int i=0;i<M;i++){
        int l,r,c; cin >> l >> r >> c;
        l--;r--;
        g[l].push_back({r,c});
    }
    for(int i=N-1;i>=1;i--){
        g[i].push_back({i-1,0});
    }
    daijkstra(0);
    if(d[N-1]>=INF) cout << -1 << endl;
    else cout << d[N-1] << endl;
}
