#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 1e5 + 5, INF= 1e18;
long long n,q;
pair<pair<long long, long long>, long long> pr[MaxN];
struct Segment_Tree
{
    vector<long long> st;
    void init(long long n)
    {
        if(n==0) return;
        st.assign(4*n+1,INF);
    }
    void update(long long id, long long l, long long r, long long u, long long val)
    {
        if(l>u||r<u)
        {
            return;
        }
        if(l==r)
        {
            st[id]=min(st[id],val);
            return;
        }
        long long mid = (l+r) >> 1;
        if(u<=mid)
        {
            update(2*id,l,mid,u,val);
        }
        else
        {
            update(2*id+1,mid+1,r,u,val);
        }
        st[id] = min(st[2 * id], st[2 * id + 1]);
    }
    long long get(long long id, long long l, long long r, long long u, long long v)
    {
        if(l>v||r<u)
        {
            return INF;
        }
        if(u<=l&&r<=v)
        {
            return st[id];
        }
        long long mid = (l+r)>>1;
        return min(get(2*id,l,mid,u,v),get(2*id+1,mid+1,r,u,v));
    }
    void update(long long u, long long val)
    {
        update(1,1,n,u,val);
    }
    long long get(long long u, long long v)
    {
        return get(1,1,n,u,v);
    }
};
Segment_Tree segtree;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> q;
    segtree.init(n);
    for (long long i=1; i<=q; i++)
    {
        cin >> pr[i].first.second >> pr[i].first.first >> pr[i].second;
    }
    sort(pr+1,pr+q+1);
    for (long long i=1; i<=q; i++)
    {
        long long l = pr[i].first.second,r = pr[i].first.first, c=pr[i].second;
        long long mn;
        if(l-1==0)
        {
            mn=0;
        }
        else
        {
            mn = segtree.get(l-1,r-1);
        }
        segtree.update(r,mn+c);
    }
    long long ans = segtree.get(n,n);
    if(ans!=INF)
    {
        cout << ans;
    }
    else
    {
        cout << -1;
    }
}