<img data-cke-saved-src="https://img-blog.csdnimg.cn/2022010704345854120.png" src="https://img-blog.csdnimg.cn/2022010704345854120.png" alt="" />
<img data-cke-saved-src="https://img-blog.csdnimg.cn/2022010704345830532.png" src="https://img-blog.csdnimg.cn/2022010704345830532.png" alt="" />
#include<stdio.h>
#include<string.h>
//#include<bits/stdc++.h>
#include<queue>
#include<algorithm>
#define ll long long
using namespace std;
#define inf 0x3f3f3f3f
struct node2
{
int v,val;
};
struct node
{
int v,val;
bool operator < (const node &a)const
{
return val>a.val;
}
};
int dis[5005],dis2[5005];
vector<node2>g[5005];
void dij()
{
priority_queue<node>q;
memset(dis,inf,sizeof dis);
memset(dis2,inf,sizeof dis2);
dis[1]=0;
q.push(node{1,0});
while(!q.empty())
{
int f=q.top().v;
int val=q.top().val;
q.pop();
if(dis2[f]<val)
continue;
for(int i=0; i<g[f].size(); i++)
{
int v=g[f][i].v;
int d2=val+g[f][i].val;
if(dis[v]>d2)
{
swap(dis[v],d2);
q.push(node{v,dis[v]});
}
if(dis2[v]>d2&&dis[v]<d2)
{
dis2[v]=d2;
q.push(node{v,dis2[v]});
}
} //printf("ok");
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<=n;i++)
{
g[i].clear();
}
for(int i=0; i<m; i++)
{
int u,v,val;
//u--,v--;
scanf("%d%d%d",&u,&v,&val);
g[u].push_back(node2{v,val});
g[v].push_back(node2{u,val});
}
dij();
printf("%d\n",dis2[n]);
}
}