rt,f[x]代表从1到x的最长路长度
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#define ll long long
#define N 1505
#define M 50005
namespace IO {
inline ll rad() {
char c=getchar();
ll f=1, x=0;
while(c<'0' || c>'9') {
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0' && c<='9') {
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
void write(ll x) {
if(x<0) {
x=-x;
putchar('-');
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
}
using namespace IO;
std::queue<int> q;
int n, m;
int ind[N];
int f[N];
struct node {
int to, nxt, w;
}edge[M];
int head[N], tot;
void add_edge(int u, int v, int w) {
edge[++tot]={v, head[u], w};
head[u]=tot;
}
int main() {
n=rad(), m=rad();
while(m--) {
int u=rad(), v=rad(), w=rad();
add_edge(u, v, w);
ind[v]++;
}
for(int i=1; i<=n; i++) {
if(!ind[i])
q.push(i);
}
while(!q.empty()) {
int x=q.front();
q.pop();
for(int i=head[x]; i; i=edge[i].nxt) {
int v=edge[i].to;
f[v]=std::max(f[v], f[x]+edge[i].w);
ind[v]--;
if(!ind[v])
q.push(v);
}
}
printf("%d\n", f[n]);
return 0;
}