/*
    Author:zeke
    
    pass System Test!
    GET AC!!
*/
#include <iostream>
#include <queue>
#include <vector>
#include <iostream>
#include <vector>
#include <string>
#include <cassert>
#include <algorithm>
#include <functional>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <deque>
#include <map>
#include <iomanip>
#include <utility>
#include <stack>
#include <math.h>
using ll = long long;
using ld = long double;
using namespace std;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define all(x) (x).begin(),(x).end()
#define rep3(var, min, max) for (ll (var) = (min); (var) < (max); ++(var))
#define repi3(var, min, max) for (ll (var) = (max) - 1; (var) + 1 > (min); --(var))
#define Mp(a,b) make_pair((a),(b))
#define F first
#define S second
#define CIN(s) int (s);cin>>(s);
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
typedef pair<ll, ll> P;
typedef vector<ll> V;
typedef vector<V> VV;
typedef vector<P> VP;
ll MOD = 1e9 + 7;
ll INF =1e18;
ld sum;
ld a,b,x;
ll INT_MAX=1e18;
struct range_minimum_query{
  // 管理したい元の配列のサイズ以上の2冪。
  ll n;
  // セグメント木(完全二分木)を管理する一次元配列。
  vector<ll> segtree;
  // minの単位元としてのINF。値は2^31-1。
  const ll INF = INT_MAX;
  
  // @param sz 管理したい元の配列のサイズ
  // nをsz以上の2冪にし、セグメント木のサイズを2*n-1、値をINFに初期化する。
  range_minimum_query(ll sz){
    for(n = 1; n<sz;) n <<= 1;
    segtree.assign(2*n-1,INF);
  }
  
  
  // 元の配列の[l,r)のminを求める。
  // @param l,r [l,r)が求めたいminの元の配列での範囲。
  // @param a,b [a,b)が現在見ている頂点の持つminの元の配列における範囲。
  // @param k   セグメント木の現在見ている頂点のindex
  // @return    セグメント木により、求められた[l,r)の最小値。
  // 上からDFSして、[l,r)内の頂点であれば自身の値を返し、そうでなければ単位元を返す。
  // このようにして帰ってきた値を全てminしたものが求めたいものである。
  // デフォルト引数にn(非staticなメンバ変数)を指定できないため、オーバーロードしている。
  ll find(ll l, ll r){
    return find(l,r,0,n,0);
  }
  ll find(ll l, ll r, ll a, ll b, ll k){
    // [a,b)が[l,r)の外側なら、影響のない単位元INFを返す。
    if(b<=l || r<=a) return INF;
    
    // [a,b)が[l,r)の内側なら、その頂点は[l,r)内で最も大きい区間minを持つので、それを返す。
    else if(l<=a && b<=r) return segtree[k];
    
    // どちらでもなければ(解説スライドでの赤線を跨いでいる状態)、もっと細分されたものを確認する必要があるため、子を確認する。
    // 左側の子は[a,(a+b)/2)の区間minを持ち、indexは2*k+1
    // 右側の子は[(a+b)/2,b)の区間minを持ち、indexは2*k+2
    // この２つの[l,r)内の区間minのminを返してやれば良い。
    // 現在見ている頂点が葉に該当する場合は必ず上の２つの条件のどちらかで捕捉されるため考えなくて良い。
    else return min(find(l,r,a,(a+b)/2,2*k+1), find(l,r,(a+b)/2,b,2*k+2));
  }
  
  // 指定した頂点とその影響する範囲の値を更新する。  
  // @param i 書き換えたい値の元の配列におけるindex
  // @param x 更新後の値
  void update(ll i, ll x){
    // 解説スライドの通り、元の配列を持つ最下段の長さをn(2冪)とすると、
    // その上のセグメント木の構造を持つ部分は n/2 + n/4 + n/8 + .. + 1 = n-1(等比級数の公式より)
    // よって、元の配列を最初に更新したいので、元の配列部分のindexに修正するため、n-1を加える。
    i += n-1;
    
    // その頂点をxに更新する。
    segtree[i] = x;
    // 更新した最下段の情報の影響する範囲を更新する。
    // 具体的には更新した頂点の祖先全てが対象となる。
    while(i>0){
      // 親ノードへと移動
      i = (i-1)/2;
      // 自分の子２つを比較し、小さい方を得る。
      segtree[i] = min(segtree[2*i+1], segtree[2*i+2]);
    }
  }
};


int main(){
   cin.tie(0);
    ios::sync_with_stdio(false);
    ll n,m;
    cin>>n>>m;
    VV vec(m,V(3));
    rep(i,m)cin>>vec[i][0]>>vec[i][1]>>vec[i][2];
    V reg(1e5+10,1e18);
    sort(all(vec));
    range_minimum_query rmq(1e6);
    rmq.update(1,0);
  //  cout<<rmq.find(0,n)<<endl;
    rep(i,m){
    //    cout<<vec[i][0]<<" "<<vec[i][1]<<" "<<"探す頂点"<<" "<<rmq.find(vec[i][0],vec[i][1]+1)<<endl;
        if(rmq.find(vec[i][0],vec[i][1]+1)!=1e18){
            //cout<<vec[i][0]<<" "<<vec[i][1]<<" "<<"有効な頂点見つける,最小値は"<<rmq.find(vec[i][0],vec[i][1]+1)<<"更新予定座標は"<<rmq.find(vec[i][1],vec[i][1]+1)<<endl;
            if(rmq.find(vec[i][1],vec[i][1]+1)>vec[i][2]+rmq.find(vec[i][0],vec[i][1]+1)){
                rmq.update(vec[i][1],vec[i][2]+rmq.find(vec[i][0],vec[i][1]+1));
          //      cout<<vec[i][1]<<"を"<<vec[i][2]+rmq.find(vec[i][0],vec[i][1]+1)<<"に更新"<<endl;
            }
        }
    }
   // rep3(i,1,n+1)cout<<rmq.find(i,i+1)<<" ";
  //  cout<<endl;
    if(rmq.find(n,n+1)==1e18){
        cout<<-1<<endl;
        return 0;
    }
    cout<<rmq.find(n,n+1)<<endl;
}

Measured memory_bytes: 22912