#include <bits/stdc++.h>
using namespace std;
#define inf INT_MAX
#define int long long
int n,m,cnt;
int a,b,c,fir[100010],nex[100010];
int dis[100010];
struct road{
int sta,fin,v;
}r[100010];
void init(int u,int w,int vi){
r[++cnt].sta=u,r[cnt].fin=w;r[cnt].v=vi;
nex[cnt]=fir[u];
fir[u]=cnt;
}
struct go{
int sta,disc;
bool operator<(const go &x)const{
return x.disc<disc;
}
};
priority_queue<go>p;
bool vis[100010];
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)dis[i]=inf;
for(int i=1;i<=m;i++)fir[i]=-1,nex[i]=-1;
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
init(a,b,c);
init(b,a,c);
}
p.push({1,0});
dis[1]=0;
while(!p.empty()){
go t=p.top();p.pop();
if(vis[t.sta])continue;
vis[t.sta]=1;
for(int i=fir[t.sta];i!=-1;i=nex[i]){
int y=r[i].fin;
if(dis[t.sta]+r[i].v<dis[y]){
dis[y]=dis[t.sta]+r[i].v;
if(!vis[y])p.push({y,dis[y]});
}
}
}
cout<<dis[n];
return 0;
}