RT

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
int dis[2001];
bool inq[2001];
struct node{
int v,w;
};
vector<node>edge[2001];
bool spfa(int s){
queue<int>q;
dis[s]=0;
q.push(s);
inq[s]=1;
int cnt[2001]={};
while(!q.empty()){
int u=q.front();
q.pop();
inq[u]=0;
if(cnt[u]>n) return 1;
for(auto [v,w]:edge[u]){
if(dis[v]<dis[u]+w){
dis[v]=dis[u]+w;
cnt[v]=cnt[u]+1;
if(!inq[v]){
q.push(v);
inq[v]=1;
}
}
}
}
return 0;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
edge[u].push_back({v,w});
}
memset(dis,0xc0c0c0c0,sizeof(dis));
memset(inq,0,sizeof(inq));
if(spfa(1)) cout<<"INF";
else cout<<dis[n];
return 0;
}