#include <bits/stdc++.h>
#include <unistd.h>
using namespace std;
typedef long long int lli;
typedef pair<lli, lli> pii;
#define dbg(x) cout << #x << " has a value of: " << x << "\n";
#define usize(x) (int)(x.size())
#define plist(x)                       \
    for (int i = 0; i < usize(x); i++) \
        cout << "eleman " << i << " = " << x[i] << "\n";
#define foreach(x) for (auto item : x)
#define fill(s, x)              \
    for (int i = 0; i < x; i++) \
        cin >> s[i];
#define in(veriler, a) (veriler.find(a) != veriler.end())
#define btw(x, y, z) x >= y&& x <= z;
std::ostream& operator<<(std::ostream& os, pair<int,int> p) {
    os << p.first << ", " << p.second;
    return os;
}
#ifdef ONLINE_JUDGE
#define fio ios_base::sync_with_stdio(false);cin.tie(null);
#else
#define fio //a
#endif
class SegmentTree{
	public:
	int n;
	bool isLazy;
	private:
	vector<lli> segTree,lazy;
	public:
	SegmentTree(){}
	SegmentTree(int n){
		segTree=vector<lli>(4*n);
		lazy=vector<lli>(4*n);
	}
	void buildTree(int node,int l,int r,vector<lli>& anaDizi){
		if(l>r)return;
		if(l==r)segTree[node]=anaDizi[l];
		else{
			buildTree(node*2,l,(l+r)/2,anaDizi);
			buildTree(node*2+1,(l+r)/2+1,r,anaDizi);
			segTree[node]=min(segTree[node*2],segTree[node*2+1]);
		}
	}
	void updateTree(int node,int a,int b,int ind,lli x){
		if(a>b)return;
		if(a>ind ||b<ind)return;
		if(a==b&&a==ind){
			segTree[node]=x;
			return;
		}
		updateTree(node*2,a,(a+b)/2,ind,x);
		updateTree(node*2+1,(a+b)/2+1,b,ind,x);
		segTree[node]=min(segTree[node*2],segTree[node*2+1]);
	}
	lli query(int node,int a,int b,int l,int r){
		if(l>r)return 1e17;
		if(a>b||a>r||b<l)return 1e17;
		if(lazy[node]!=0){
			segTree[node]+=lazy[node]*(b-a+1);
			lazy[node*2]+=lazy[node];
			lazy[node*2+1]+=lazy[node];
			lazy[node]=0;
		}
		if(a>=l&&b<=r)return segTree[node];
		return min(query(node*2,a,(a+b)/2,l,r),
		query(node*2+1,(a+b)/2+1,b,l,r));
		
	}
};
typedef pair<lli,pii> psi;
int main(){
	ios_base::sync_with_stdio(false);cin.tie(null);
	int n,m;
	cin>>n>>m;
	vector<psi> aras;
	for (int i = 0; i < m; i++)
	{
		lli a,b,cost;
		cin>>a>>b>>cost;
		aras.push_back(psi(a,pii(cost,b)));
	}
	sort(aras.begin(),aras.end());
	vector<lli> dist(n+1,1e17);
	dist[1]=0;
	SegmentTree st(n+1);
	st.buildTree(1,1,n,dist);
	lli last=1;
	for (int i = 0; i < m; i++)
	{
		lli cost=aras[i].second.first;
		lli a=aras[i].first,b=aras[i].second.second;
		//dbg(cost);
		for (lli smd = min(last+1,a); smd <= b; smd++)
		{
			//dbg(smd);
			//dbg(a);
			//dbg(st.query(1,1,n,a,smd-1));
			dist[smd]=min(dist[smd],st.query(1,1,n,a,smd-1)+cost);
			//dbg(dist[smd]);
			if(dist[smd]!=1e17)last=smd;
			else break;
			st.updateTree(1,1,n,smd,dist[smd]);
		}
		
	}
	cout<<(dist[n]==1e17?-1:dist[n])<<"\n";
	return 0;
}
