#include <bits/stdc++.h>
using namespace std;
const int N=3005;
int n,m,g[N][N];
int dis[N];
bool f[N];
int dijkstra(){
memset(dis,0x3f3f3f,sizeof dis);
dis[1]=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!f[j]&&(t==-1||dis[t]>dis[j]))
t=j;
}
f[t]=true;
for(int j=1;j<=n;j++){
dis[j]=min(dis[j],dis[t]+g[t][j]);
}
}
if(dis[n]==0x3f3f3f)
return -1;
else
return dis[n];
}
int main(){
cin>>n>>m;
memset(g,0x3f3f3f,sizeof g);
while(m--){
int a,b,c;
cin>>a>>b>>c;
g[a][b]=min(g[a][b],c);
g[b][a]=min(g[b][a],c);
}
int t=dijkstra();
cout<<t;
}
#include <bits/stdc++.h>
using namespace std;
const int N=10010;
int n,m;
typedef pair<int,int> PII;
int h[N],e[N],ne[N],idx,w[N],dis[N];
bool f[N];
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int dijkstra(){
memset(dis,0x3f3f3f,sizeof dis);
priority_queue<PII,vector<PII>,greater<PII>> q;
q.push({0,1});
while(q.size()){
auto i=q.top();
q.pop();
int len=i.first,var=i.second;
if(f[var])
continue;
f[var]=true;
for(int i=h[var];i!=-1;i=ne[i]){
int j=e[i];
if(dis[j]>len+w[i]){
dis[j]=len+w[i];
q.push({dis[j],j});
}
}
}
if(dis[n]==0x3f3f3f)
return -1;
else
return dis[n];
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
while(m--){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
int t=dijkstra();
cout<<t;
}