#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <list>
#include <deque>
#include <bitset>
#include <iterator>
#include <cctype>
#include <sstream>
#include <utility>
#include <iomanip>
#include <limits>
#include <ctime>
#include <cstdlib>
const int inf=0x3f;
const int err=-1;
const int N=5e2+10;
const int M=1e5+10;
using namespace std;
inline int read()
{
int f=1;
int x=0;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while('0'<=c&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return f*x;
}
void write(int x)
{
if(x<0)
{
putchar('-'),x=-x;
}
if(x>9)
{
write(x/10);
}
putchar(x%10+'0');
return;
}
int n,m;
int g[N][N];
int dist[N];
int s[N];
inline void init_a()
{
memset(g,inf,sizeof(g));
for(int i=1,j=1;i<=n&&j<=n;i++,j++)
{
g[i][j]=0;
}
for(int i=1;i<=n;i++)
{
s[i]=0;
}
s[1]=1;
return;
}
inline void init_b()
{
for(int i=1;i<=n;i++)
{
dist[i]=g[1][i];
}
return;
}
int Dijkstra()
{
int node=-1;
for(int i=1;i<n-1;i++)
{
int minx=inf;
for(int j=1;j<=n;j++)
{
if(s[j]==0&&(node==-1||dist[j]<minx))
{
minx=dist[j];
node=j;
}
}
s[node]=1;
for(int k=1;k<=n;k++)
{
if(g[node][k]<inf)
{
if(dist[k]>dist[node]+g[node][k])
{
dist[k]=dist[node]+g[node][k];
}
}
}
}
if(dist[n]==inf)
{
return -1;
}
else
{
return dist[n];
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
init_a();
n=read();
m=read();
for(int i=0;i<m;i++)
{
int x,y,z;
x=read();
y=read();
z=read();
g[x][y]=min(g[x][y],z);
}
init_b();
write(Dijkstra());
puts("");
return 0;
}