#pragma GCC optimize(3)
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
struct edge{int v,w;};
struct edgeq{int v,w;bool operator<(edgeq a)const{return a.w<w;}};
int n,m,a[20001];
bool flag[20001];
vector<edge> g[20001];
priority_queue<edgeq> q;
int main(){
cin.tie(0),cout.tie(0);
memset(a,127,sizeof(a));
a[1]=0;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
g[u].push_back((edge){v,w});
}
q.push((edgeq){1,0});
flag[1]=true;
while(!q.empty()){
int u=q.top().v;
q.pop();
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(flag[v])continue;
if(a[u]+w<a[v]){
a[v]=a[u]+w;
q.push((edgeq){v,a[v]});
}
}
}
cout<<a[n];
}