#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define M 100000 #define pa pair<int,int>//优先比较第一个元素 using namespace std; int d[M],n,m,cnt,head[M],next[M],u[M],dis[M],num,s,t; bool f[M]; void add(int from,int to,int di) {num++;u[num]=to;next[num]=head[from];head[from]=num;dis[num]=di; } int main() {scanf("%d%d%d%d",&n,&m,&s,&t);for(int i=1;i<=m;i++){int uu,vv,d;scanf("%d%d%d",&uu,&vv,&d);add(uu,vv,d);add(vv,uu,d);}memset(d,127/3,sizeof(d));d[s]=0;priority_queue<pa,vector<pa>,greater<pa> > q;//堆优化 q.push(make_pair(0,s));//make一个pa 距离s为0 标号为s while(!q.empty()){int p=q.top().second;//取出优先级最高的点的 q.pop();if(f[p])//判重 continue;f[p]=1;for(int i=head[p];i;i=next[i]){if(d[u[i]]>d[p]+dis[i]){d[u[i]]=d[p]+dis[i];q.push(make_pair(d[u[i]],u[i]));//make一个新的 pa }}}cout<<d[t];return 0; }