#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define int long long
#define N 1000010
#define M 4000010
#define gc getchar
#define Rg register
#define mid ((l+r)>>1)
using namespace std;

inline int rd(){
  int x=0; bool f=0; char c=gc();
  while(!isdigit(c)){if(c=='-')f=1;c=gc();}
  while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
  return f?-x:x;
}

int n,m,s,cnt,tot,hd[N<<3];

struct edge{int w,to,nxt;}e[M<<1];

inline void add(int u,int v,int w){
  e[++tot].to=v; e[tot].w=w;
  e[tot].nxt=hd[u]; hd[u]=tot;
}

struct segmentin{

  int root,ptr;

  inline int newnode(){return ++ptr;}

  struct node{int ls,rs,p;}c[N<<1];

  void build(int &rt,int l,int r){
    rt=newnode();
    if(l==r){c[rt].p=l;return;}
    build(c[rt].ls,l,mid);
    build(c[rt].rs,mid+1,r);
    c[rt].p=++cnt;
    add(c[rt].p,c[c[rt].ls].p,0);
    add(c[rt].p,c[c[rt].rs].p,0);
  }

  void updata(int rt,int l,int r,int L,int R,int p,int w){
    if(l>R||r<L) return;
    if(l>=L&&r<=R){add(p,c[rt].p,w);return;}
    if(L<=mid) updata(c[rt].ls,l,mid,L,R,p,w);
    if(R>mid) updata(c[rt].rs,mid+1,r,L,R,p,w);
  }

}treein;

struct segmentout{

  int root,ptr;

  inline int newnode(){return ++ptr;}

  struct node{int ls,rs,p;}c[N<<1];

  void build(int &rt,int l,int r){
    rt=newnode();
    if(l==r){c[rt].p=l;return;}
    build(c[rt].ls,l,mid);
    build(c[rt].rs,mid+1,r);
    c[rt].p=++cnt;
    add(c[c[rt].ls].p,c[rt].p,0);
    add(c[c[rt].rs].p,c[rt].p,0);
  }

  void updata(int rt,int l,int r,int L,int R,int p,int w){
    if(l>R||r<L) return;
    if(l>=L&&r<=R){add(c[rt].p,p,w);return;}
    if(L<=mid) updata(c[rt].ls,l,mid,L,R,p,w);
    if(R>mid) updata(c[rt].rs,mid+1,r,L,R,p,w);
  }

}treeout;

int dis[N<<3];

bool vis[N<<3];

priority_queue<pair<int,int> >q;

inline void dij(){
	for ( int i = 1 ; i <= n ; i++ ) 
		dis[i] = 1e16;
  memset(dis,0x3f3f3f3f,sizeof(dis));
  dis[s]=0; q.push(make_pair(0,s));
  while(!q.empty()){
    int u=q.top().second; q.pop();
    if(vis[u]) continue; vis[u]=1;
    for(Rg int i=hd[u],v;i;i=e[i].nxt)
      if(dis[v=e[i].to]>dis[u]+e[i].w){
        dis[v]=dis[u]+e[i].w;
        q.push(make_pair(-dis[v],v));
      }
  }
}

signed main(){
  cnt=n=rd(); m=rd();
  treein.build(treein.root,1,n);
  treeout.build(treeout.root,1,n);
  for(Rg int i=1,l1,r1,l2,r2;i<=m;++i){
    ++cnt;
    l1=rd(); r1=rd();int cc=rd();
    l2=l1,r2=r1;
    treein.updata(treein.root,1,n,l1,r1,cnt,cc);
    treein.updata(treein.root,1,n,l2,r2,cnt,cc);
    treeout.updata(treeout.root,1,n,l1,r1,cnt,cc);
    treeout.updata(treeout.root,1,n,l2,r2,cnt,cc);
  }
  s=1;
  dij();
  if ( dis[n] != 1e16 ) 
  	printf("%lld\n",dis[n]/2);
  else puts ( "-1" );
  return 0;
}