#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void write(int x){
if(x==0){putchar('0');return;}
int len=0,k1=x,c[10005];
if(k1<0)k1=-k1,putchar('-');
while(k1)c[len++]=k1%10+'0',k1/=10;
while(len--)putchar(c[len]);
}
const int N=2e5+5;
struct node{
int w,v;
};
struct Node{
int w,v;
bool operator < (const Node &x) const{
return x.v<=v;
}
};
int dist[N],flag[N],dis2[N];
vector<node>edge[N];
priority_queue<Node>q;
void dijkstra(){
while(!q.empty()){
int ww=q.top().w,vv=q.top().v;q.pop();
for(int i=0;i<edge[ww].size();i++){
int w=edge[ww][i].w,v=edge[ww][i].v;
if(v+vv<dist[w]){
dis2[w]=dist[w];
dist[w]=v+vv;
q.push({w,dist[w]});
}
else if(v+vv<dis2[w]&&v+vv>dist[w]){
dis2[w]=v+vv;
q.push({w,dis2[w]});
}
}
}
}
signed main(){
int m=read(),n=read();
for(int i=1;i<=m;i++){
int a=read(),b=read(),c=read();
edge[a].push_back({b,c});
edge[b].push_back({a,c});
}
for(int i=1;i<=n;i++)dist[i]=dis2[i]=INT_MAX;
dist[1]=0;
q.push({1,0});
dijkstra();
write(dis2[n]);
return 0;
}