#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];
}