#include<bits/stdc++.h>
using namespace std;
const int N=(int)1e5+10;
const int INF=(int)1e9+10;
int n,head[N],nxt[N*2],to[N*2];
long long w[N*2];
int cnt=0;
long long d[N];
struct node{
long long dis;
int u;
bool operator <(const node &cmp)const{
return dis>cmp.dis;
}
};
priority_queue<node>q;
void add(int a,int b,long long c){
to[cnt]=b;
w[cnt]=c;
nxt[cnt]=head[a];
head[a]=cnt;
cnt++;
}
void dijkstra(){
for(int i=1;i<=n;i++) d[i]=INF;
d[1]=0;
node t;
t.u=1;t.dis=0;
q.push(t);
while(!q.empty()){
node t=q.top();
q.pop();
int u=t.u;
if(t.dis>d[t.u]){
t.dis=d[t.u];
continue;
}
for(int i=head[u];i!=-1;i=nxt[i]){
int v=to[i];
if(d[u]+w[i]<d[v]){
d[v]=d[u]+w[i];
node s;
s.u=v;
s.dis=d[v];
q.push(s);
}
}
}
if(d[n]!=INF) printf("%lld\n",d[n]);
else printf("-1\n");
}
int main(){
int m;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
while(m--){
int a,b;
long long c;
scanf("%d%d%lld",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
dijkstra();
return 0;
}