#include<iostream>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
#define pr(x) cout<<"ans="<<x<<endl;
#define pp(x) cout<<x<<"\n";
#define ll long long int
const int mod=1e9+7;
const int N=5e3+10;
int n,m;
struct node
{
int v,w;
};
vector<node> mp[N];
int in[N];
ll dis[N];
bool vis[N];
bool spfa(int u)
{
memset(in,0,sizeof(in));
queue<int> q;
for(int i=0;i<=n;i++)
{
dis[i]=mod;
}
vis[u]=1;
dis[u]=0;
// in[u]++;
q.push(u);
while(q.size())
{
auto now=q.front();
// cout<<now<<endl;
q.pop();
vis[now]=0;
for(auto x:mp[now])
{
if(dis[x.v]>dis[now]+x.w){
dis[x.v]=dis[now]+x.w;
if(!vis[x.v])
{
vis[x.v]=1;
in[x.v]++;
q.push(x.v);
if(in[x.v]>n+1)
return false;
}
}
}
}
return true;
}
void solve()
{ //转化条件,b[i]为a[i]的前缀和
cin>>n>>m;//差分约束问题,需要满足以下条件,同时dis【n】最小,可直接设dis[n]=0,
// 答案为dis[n]-dis[0];
for(int i=1;i<=n+1;i++)//dis[i]-1>=dis[i-1] -dis[i]<=-1-dis[i-1]
{
mp[i].push_back({i-1,-1});
}
for(int i=1;i<=m;i++)
{
int l,r,c;
cin>>l>>r>>c;//dis[r]-c>=dis[l-1],dis[r]<=dis[l-1]+c
mp[l-1].push_back({r,c});
mp[r].push_back({l-1,-c});
}
if(!spfa(n))
{
cout<<"-1"<<endl;
}
else
{
cout<<dis[n]-dis[0]<<endl;
}
}
int main()
{
int _=1;
// cin>>_;
while(_--)
{
solve();
}
}