#include <iostream>
#include 
<vector>
#include 
<queue>
#define MAXN 30001
using namespace std;

struct type1
{
    
int v, w;
    
bool operator < (const type1& e) const {
        
return w > e.w;
    }
};

int D[MAXN];

int dijk(vector<vector<type1> >& map, int s, int t)
{
    priority_queue
<type1> q;
    
bool mk[MAXN] = {false};
    type1 e 
= {s, 0}, ne;
    
int i, k, tmp;
    
    D[s] 
= 0
    q.push(e);
    
while (!q.empty())
    {
        e 
= q.top();
        q.pop();
        
if (mk[e.v]) continue;
        
if (e.v == t) return D[t];
        
for (mk[e.v] = true, i = 0; i < map[e.v].size(); i++)
        {
            k 
= map[e.v][i].v;
            
if (!mk[k] && (tmp = e.w + map[e.v][i].w) < D[k])
            {
                D[ne.v 
= k] = ne.w = tmp;
                q.push(ne);
            }
        }
    }
    
return D[t];
}

int main()
{
    
int n, m;
    
int a, b, c;
    type1 t;
    
    scanf(
"%d %d"&n, &m);
    vector
<vector<type1> > map(n);
    
for (int i = 0; i < n; i++)
        D[i] 
= INT_MAX;
    
while (m--)
    {
        scanf(
"%d %d %d"&a, &b, &c);
        t.v 
= b - 1;
        t.w 
= c;
        map[a
-1].push_back(t);
    }
    printf(
"%d\n", dijk(map, 0, n-1));
    
return 0;
}