#include<bits/stdc++.h>
using namespace std;
struct point{
vector<int> edge_to,edge_w;
int cnt_from=0,cnt_to=0;
};
#define MAXN 2000
#define MEMINF 0x3f
point graph[MAXN];
int n,m;
int read_u,read_v,read_w;
vector<int> top_ans;
int p1,pn;
long long dper[MAXN];
int ans=-1;
void top_sort(){
queue<int> zero_point;
int now_deal,now_to;
for(int i=1;i<=n;i++){
if(graph[i].cnt_from==0){
zero_point.push(i);
}
}
while(!zero_point.empty()){
now_deal=zero_point.front();
zero_point.pop();
for(int i=0;i<graph[now_deal].edge_to.size();i++){
now_to=graph[now_deal].edge_to[i];
graph[now_to].cnt_from--;
if(graph[now_to].cnt_from==0){
zero_point.push(now_to);
}
}
top_ans.push_back(now_deal);
}
return;
}
int main(){
memset(dper,-MEMINF,sizeof(dper));
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d %d %d",&read_u,&read_v,&read_w);
graph[read_u].edge_to.push_back(read_v);
graph[read_u].edge_w.push_back(read_w);
graph[read_u].cnt_to++;
graph[read_v].cnt_from++;
}
top_sort();
for(int i=0;i<n;i++){
if(top_ans[i]==1){
p1=i;
}
if(top_ans[i]==n){
pn=i;
}
}
dper[p1]=0;
for(int i=p1+1;i<=pn;i++){
for(int j=0;j<graph[i].edge_w.size();j++){
dper[i]=max(dper[i],graph[i].edge_w[j]+dper[j]);
}
}
if(dper[pn]<0){
printf("-1\n");
}else{
printf("%lld\n",dper[pn]);
}
return 0;
}