#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
struct node
{
int v;
int w;
};
const int N = 1510;
vector<node> vec[N];
long long f[N];
int din[N];
queue<int> q;
void add(int u1 , int v1 , int w1)
{
vec[u1].push_back({v1,w1});
}
int main()
{
memset(f,128,sizeof(f)); //初始化极小值
int n,m;
cin >> n >> m;
for (int i = 1 ; i <= m ; i++)
{
int u2,v2,w2;
cin >> u2 >> v2 >> w2;
if (vec[u2].size() == 0)
{
add(u2,v2,w2);
}
else
{
for (int i = 0 ; i < vec[u2].size() ; i++) //有重复边取最大边权
{
if (vec[u2][i].v == v2)
{
vec[u2][i].w = max(vec[u2][i].w , w2);
break;
}
}
add(u2,v2,w2);
}
}
q.push(1);
f[1] = 0;
while (!q.empty()) //找到1能延伸到的点,只有这些点计算入度
{
int t = q.front();
q.pop();
for (int i = 0 ; i < vec[t].size() ; i++)
{
int d = vec[t][i].v;
q.push(d);
din[d]++;
}
}
q.push(1);
while (!q.empty()) //动态规划
{
int t = q.front();
q.pop();
for (int i = 0 ; i < vec[t].size() ; i++)
{
if (f[vec[t][i].v] < -2e10)
{
f[vec[t][i].v] = f[t] + vec[t][i].w;
}
else
{
f[vec[t][i].v] = max(f[vec[t][i].v] , f[t] + vec[t][i].w);
}
din[vec[t][i].v]--;
if (din[vec[t][i].v] == 0) //入度为0入队
{
q.push(vec[t][i].v);
}
}
}
if (f[n] < -2e10) //不可达
{
cout << -1 << endl;
}
else
{
cout << f[n] << endl;
}
return 0;
}
WA+MLE,救救孩子