#include<bits/stdc++.h>
using namespace std;
#define int long long
#define t 1000005
bool flag[t];
int n,m,x,y,z;
int top,st[t];
bool vis[t];
int o[t];
int ans;
int a[t],b[t],c[t];
struct enode {
int to,nxt,value;
}e[t];
int cnt,head[t];
int id,num,idx[t],low[t],dfn[t];
void add1(int u,int v) {
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
return;
}
void add2(int u,int v,int w) {
e[++cnt].to=v;
e[cnt].nxt=head[u];
e[cnt].value=w;
head[u]=cnt;
return;
}
struct node {
int xx,yy;
bool operator>(const node& a)const {
return xx>a.xx;
}
};
void dfs(int u) {
st[++top]=u;
flag[u]=true;
low[u]=dfn[u]=++id;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].to;
if(!dfn[v]) {
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(flag[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
num++;
while(true) {
int v=st[top--];
flag[v]=false;
idx[v]=num;
if(u==v) break;
}
}
return;
}
void dijkstra(int v) {
priority_queue<node,vector<node>,greater<node> > q;
memset(o,0x3f3f3f3f,sizeof(o));
o[v]=0;
q.push({0,v});
while(!q.empty()) {
int tmp=q.top().yy;
q.pop();
if(vis[tmp]) continue;
vis[tmp]=true;
for(int i=head[tmp];i;i=e[i].nxt) {
int tx=e[i].to,ty=e[i].value;
if(o[tx]>o[tmp]+ty) {
o[tx]=o[tmp]+ty;
q.push({o[tx],tx});
}
}
}
return;
}
signed main() {
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++) {
scanf("%lld%lld%lld",&a[t],&b[t],&c[t]);
add1(a[t],b[t]);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i);
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
cnt=0;
for(int i=1;i<=m;i++)
if(idx[a[i]]!=idx[b[i]])
add2(idx[a[i]],idx[b[i]],c[i]);
dijkstra(idx[1]);
printf("%lld",o[idx[n]]);
return 0;
}