#include <bits/stdc++.h>
using namespace std;
#define MAX 1505
#define INF 0x3F3F3F3F
int n, m;
vector<int> edges[MAX];
vector<int> deg[MAX];
int indeg[MAX];
int longest[MAX];
int TropSort(){
queue<int> st;
for(int i=2; i<=n; i++){
// 带负权需要把2以上点初始为-INF
longest[n] = -INF;
// 2号以上点的松弛处理
if(indeg[i] == 0) st.push(i);
}
// 需要预处理:非1的入度为0点既不能不管,又不能加入栈
// 不管则延伸出来的点入度总大于0,终点无法到达
// 管了则会出错(因为本来那些点无法到达)
// 需要额外的松弛操作“放弃”那些点, 从而使得算法顺利进行
while(!st.empty()){
int p = st.front(); st.pop();
for(auto &q: edges[p]){
indeg[q]--;
if(indeg[q] == 0) st.push(q);
}
}
// 1号点的处理
st.push(1);
while(!st.empty()){
int p = st.front(); st.pop();
for(int i=0; i<edges[p].size(); i++){
longest[edges[p][i]] = max(longest[edges[p][i]],
longest[p] + deg[p][i]);
indeg[edges[p][i]]--;
if(indeg[edges[p][i]] == 0) st.push(edges[p][i]);
}
}
if(longest[n] == -INF) return -1;
else return longest[n];
}
int main(){
cin >> n >> m;
int u, v, w;
for(int i=0; i<m; i++){
cin >> u >> v >> w;
edges[u].push_back(v);
deg[u].push_back(w);
indeg[v]++;
}
int ans = TropSort();
cout << ans;
return 0;
}