#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n,m,lp[100010],rp[100010],w[100010];
bool used[100010],vis[400040];
long long dis[100010];
vector<int>E[400040];
priority_queue<pair<int,int> >q;
void add(int k,int l,int r,int ll,int rr,int id)
{
	if(l>rr||r<ll)return ;
	if(l>=ll&&r<=rr)return E[k].push_back(id),void();
	add(k<<1,l,l+r>>1,ll,rr,id);
	add(k<<1|1,(l+r>>1)+1,r,ll,rr,id);
}
int find(int k,int l,int r,int ll,int rr)
{
	if(l>rr||r<ll||vis[k])return 0;
	if(l==r)return vis[k]=1,l;
	int ret=0;
	if(ret=find(k<<1,l,l+r>>1,ll,rr))return vis[k]=vis[k<<1]&vis[k<<1|1],ret;
	if(ret=find(k<<1|1,(l+r>>1)+1,r,ll,rr))return vis[k]=vis[k<<1]&vis[k<<1|1],ret;
	vis[k]=vis[k<<1]&vis[k<<1|1];
	return 0;
}
void query(int k,int l,int r,int p)
{
	int x;
	for(auto u:E[k])
		if(!used[u])
		{
			used[u]=1;
			q.push(make_pair(-dis[p]-w[u],u));
		}
	E[k].clear();
	if(l==r)return ;
	if(p<=l+r>>1)query(k<<1,l,l+r>>1,p);
	else query(k<<1|1,(l+r>>1)+1,r,p);	
}
int main()
{
	scanf("%d %d",&n,&m);
	int x,y;
	for(int i=1;i<=m;++i)
	{
		scanf("%d %d %d",&lp[i],&rp[i],&w[i]);
		add(1,1,n,lp[i],rp[i],i);
	}
	query(1,1,n,1);
	find(1,1,n,1,1);
	while(!q.empty())
	{
		x=q.top().second;
	//	printf("%d\n",x);
		while(y=find(1,1,n,lp[x],rp[x]))dis[y]=-q.top().first,query(1,1,n,y);
		q.pop();
	}
	if(dis[n])printf("%lld",dis[n]);
	else printf("-1");
	return 0;
}
