#include <cstdio>
#include <iostream>
#include <vector>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define lson u<<1,l,mid
#define rson u<<1|1,mid+1,r
#define fi first
#define se second
using namespace std;
inline char nc()
{
    // return getchar();
    static char buf[100000],*l=buf,*r=buf;
    return l==r&&(r=(l=buf)+fread(buf,1,100000,stdin),l==r)?EOF:*l++;
}
template<class T> void read(T &x)
{
    x=0; int f=1,ch=nc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=nc();}
    while(ch>='0'&&ch<='9'){x=x*10-'0'+ch;ch=nc();}
    x*=f;
}
typedef long long ll;
typedef pair<ll,ll> pll;
const ll inf=1e18;
const int maxn=1e5+50;
const int maxm=1e5+50;
int n,m;
int L[maxm],R[maxm],C[maxm];
ll dis[maxm];
bool vis[maxm];
vector<int> vec;
namespace seg0
{
    const int maxnode=maxn<<2;
    vector<int> s[maxnode];
    void update(int u,int l,int r,int ql,int qr,int qv)
    {
        if(l==ql&&r==qr)
        {
            s[u].push_back(qv);
            return;
        }
        int mid=(l+r)>>1;
        if(qr<=mid) update(lson,ql,qr,qv);
        else if(ql>mid) update(rson,ql,qr,qv);
        else
        {
            update(lson,ql,mid,qv);
            update(rson,mid+1,qr,qv);
        }
    }
    void query(int u,int l,int r,int qp)
    {
        for(int i=0;i<s[u].size();++i)
        {
            int x=s[u][i]; if(vis[x]) continue;
            vis[x]=1;
            vec.push_back(x);
        }
        s[u].clear();
        if(l==r)
        {
            return;
        }
        int mid=(l+r)>>1;
        if(qp<=mid) query(lson,qp);
        else query(rson,qp);
    }
}
namespace seg1
{
    const int maxnode=maxn<<2;
    ll tag[maxnode];
    int rest[maxnode];
    pll mn[maxnode];
    void change(int u,ll d)
    {
        if(rest[u]==-1) return;
        if(tag[u]==-1||tag[u]>d) tag[u]=d;
        if(mn[u].fi>d) mn[u]=make_pair(d,rest[u]);
    }
    inline void pushdown(int u)
    {
        if(tag[u]!=-1)
        {
            change(u<<1,tag[u]);
            change(u<<1|1,tag[u]);
            tag[u]=-1;
        }
    }
    inline void pushup(int u)
    {
        mn[u]=min(mn[u<<1],mn[u<<1|1]);
        rest[u]=-1;
        if(rest[u<<1]!=-1) rest[u]=rest[u<<1];
        if(rest[u<<1|1]!=-1) rest[u]=rest[u<<1|1];
    }
    void build(int u,int l,int r)
    {
        tag[u]=-1;
        if(l==r)
        {
            mn[u]=make_pair(l==1?0:inf,l);
            rest[u]=l;
            return;
        }
        int mid=(l+r)>>1;
        build(lson);
        build(rson);
        pushup(u);
    }
    void remove(int u,int l,int r,int qp)
    {
        if(l==r)
        {
            mn[u]=make_pair(inf,inf);
            rest[u]=-1;
            return;
        }
        int mid=(l+r)>>1;
        pushdown(u);
        if(qp<=mid) remove(lson,qp);
        else remove(rson,qp);
        pushup(u);
    }
    void update(int u,int l,int r,int ql,int qr,ll qv)
    {
        if(l==ql&&r==qr)
        {
            change(u,qv);
            return;
        }
        int mid=(l+r)>>1;
        pushdown(u);
        if(qr<=mid) update(lson,ql,qr,qv);
        else if(ql>mid) update(rson,ql,qr,qv);
        else
        {
            update(lson,ql,mid,qv);
            update(rson,mid+1,qr,qv);
        }
        pushup(u);
    }
}
int main()
{
    read(n),read(m);
    for(int i=1;i<=m;++i)
    {
        read(L[i]),read(R[i]),read(C[i]);
        seg0::update(1,1,n,L[i],R[i],i);
    }
    seg1::build(1,1,n);
    while(seg1::mn[1].se!=inf)
    {
        int u=seg1::mn[1].se;  
        dis[u]=seg1::mn[1].fi;
        seg1::remove(1,1,n,u);
        vec.clear();
        seg0::query(1,1,n,u);
        for(int i=0;i<vec.size();++i)
        {
            int x=vec[i];
            seg1::update(1,1,n,L[x],R[x],dis[u]+C[x]);
        }
    }
    printf("%lld\n",dis[n]==inf?-1:dis[n]);
    return 0;
}

Measured memory_bytes: 33024