#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
#define lson(x) ((x)<<1)
#define rson(x) ((x)<<1|1)
const ll MAXN=100010;
const ll MAXM=1000010;
long long INF;

struct node{//segment_tree
    ll id;
    ll l,r;
}intree[MAXN<<2],outree[MAXN<<2];

//两种写法均可
//struct edge{//graph::edge
//    ll v;
//    long long w;
//    edge *nxt;
//    edge(){
//        v=w=0;
//        nxt=NULL;
//    }
//}*head[MAXM];

struct edge{
    ll v;
    long long w;
    ll nxt;
}e[MAXM<<2]; //记得开大，不然re

struct road{//dijkstra
    ll i;
    long long dis;
    bool operator<(const road &rhs)const{
        return dis>rhs.dis;
    }
};
priority_queue<road>q;
ll n,m,s;
ll innum[MAXN],ounum[MAXN];
long long d[MAXM];
ll vis[MAXM],cnt=0;
ll tot = 0;
ll head[MAXM<<2]; 
void adde(ll u,ll v,long long w){
//    edge *p=new edge;
//    p->v=v;p->w=w;
//    p->nxt=head[u];
//    head[u]=p;
tot++;
e[tot].v = v;
e[tot].w = w;
e[tot].nxt = head[u];
head[u] = tot;
}

ll inbuild(ll o,ll l,ll r){
    intree[o].l=l;intree[o].r=r;intree[o].id=cnt++;
    if(l==r)
        return innum[l]=intree[o].id;
    ll mid=(l+r)>>1;
    adde(inbuild(lson(o),l,mid),intree[o].id,0);
    adde(inbuild(rson(o),mid+1,r),intree[o].id,0);
    return intree[o].id;
}
ll oubuild(ll o,ll l,ll r){
    outree[o].l=l;outree[o].r=r;outree[o].id=cnt++;
    if(l==r)
        return ounum[l]=outree[o].id;
    ll mid=(l+r)>>1;
    adde(outree[o].id,oubuild(lson(o),l,mid),0);
    adde(outree[o].id,oubuild(rson(o),mid+1,r),0);
    return outree[o].id;
}
void inmodify(ll o,ll l,ll r,ll fa,long long w){
    if(intree[o].l>=l&&intree[o].r<=r){
        adde(intree[o].id,fa,w);
        return;
    }
    ll mid=(intree[o].l+intree[o].r)>>1;
    if(r<=mid)
        inmodify(lson(o),l,r,fa,w);
    else if(l>=mid+1)
        inmodify(rson(o),l,r,fa,w);
    else{
        inmodify(lson(o),l,mid,fa,w);
        inmodify(rson(o),mid+1,r,fa,w);
    }
}
void oumodify(ll o,ll l,ll r,ll fa,long long w){
    if(outree[o].l>=l&&outree[o].r<=r){
        adde(fa,outree[o].id,w);
        return;
    }
    ll mid=(outree[o].l+outree[o].r)>>1;
    if(r<=mid)
        oumodify(lson(o),l,r,fa,w);
    else if(l>=mid+1)
        oumodify(rson(o),l,r,fa,w);
    else{
        oumodify(lson(o),l,mid,fa,w);
        oumodify(rson(o),mid+1,r,fa,w);
    }
}

void sssp(){
    memset(d,0x7f,sizeof(d));INF=d[0];
    q.push((road){innum[1],0});d[innum[1]]=0;
    while(!q.empty()){
        road t=q.top();q.pop();
        if(d[t.i]!=t.dis)
            continue;
        for(ll i=head[t.i];i!=NULL;i=e[i].nxt){
            if(t.dis+e[i].w<d[e[i].v]){
                ll v=e[i].v;
                d[v]=t.dis+e[i].w;
                q.push((road){v,d[v]});
            }
        }
    }
} 

int main(){
    scanf("%lld%lld",&n,&m);
    inbuild(1,1,n);oubuild(1,1,n);
    for(ll i=1;i<=n;i++){
        adde(innum[i],ounum[i],0);
        adde(ounum[i],innum[i],0);
    }
    while(m--){
        ll l,r,w;scanf("%lld%lld%lld",&l,&r,&w);
        ++cnt;
        oumodify(1,l,r,cnt,w);
        inmodify(1,l,r,cnt,w);
    }
    sssp();
    int id=ounum[n];
    if(d[id]!=INF)printf("%lld\n",d[id]/2);
    else printf("-1\n");
    return 0;
}

Measured memory_bytes: 115060