#include<cstdio>
#include<vector>
#include<iostream>
#include<climits>
#define Invalid -10000000000
#define Unknown -20000000000
using namespace std;
int n, m;
struct Node
{
vector<int> Neighbor;
};
Node G[1505];
long long E[1505][1505];
long long Mem[1505];
long long dp(int k)
{
if(Mem[k] != Unknown)
{
return Mem[k];
}
else
{
long long res = Invalid;
int end = G[k].Neighbor.size() - 1;
for(int i = 0; i <= end; i++)
{
if(dp(G[k].Neighbor[i]) != Invalid)
{
res = max(E[k][G[k].Neighbor[i]] + dp(G[k].Neighbor[i]), res);
}
}
Mem[k] = res;
return res;
}
}
int main()
{
scanf("%d%d", &n, &m);
int u, v;
long long w;
for(int i = 1; i <= m; i++)
{
cin >> u >> v >> w;
E[u][v] = w;
G[u].Neighbor.push_back(v);
}
for(int i = 1; i <= n; i++)
{
Mem[i] = Unknown;
}
Mem[n] = 0;
long long ans = dp(1);
if(ans == Invalid)
{
printf("-1");
}
else
{
printf("%lld", ans);
}
return 0;
}