1 #include <bits/stdc++.h> 2 #define pb push_back 3 #define _for(i,a,b) for(int i = (a);i < (b);i ++) 4 #define INF INT_MAX 5 #define ll long long 6 7 using namespace std; 8 9 const int maxn = 500003; 10 inline ll read() 11 { 12 ll ans = 0; 13 char ch = getchar(), last = ' '; 14 while(!isdigit(ch)) last = ch, ch = getchar(); 15 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); 16 if(last == '-') ans = -ans; 17 return ans; 18 } 19 inline void write(ll x) 20 { 21 if(x < 0) x = -x, putchar('-'); 22 if(x >= 10) write(x / 10); 23 putchar(x % 10 + '0'); 24 } 25 struct edge 26 { 27 ll to; 28 ll cost; 29 }; 30 vector<edge> G[maxn]; 31 32 ll V,E; 33 34 typedef pair<ll,ll> P;//first 是最短距离,second 是顶点编号 35 ll d[maxn]; 36 void shortest_path(ll s) 37 { 38 priority_queue<P,vector<P>,greater<P>> que; 39 40 _for(i,1,V+1) 41 d[i] = INF; 42 d[s] = 0; 43 que.push(P{0,s}); 44 45 while(!que.empty()) 46 { 47 P p = que.top();que.pop(); 48 ll v = p.second; 49 if(d[v] < p.first) continue; 50 _for(i,0,G[v].size()) 51 { 52 edge e = G[v][i]; 53 if(d[e.to] > d[v] + e.cost) 54 { 55 d[e.to] = d[v] + e.cost; 56 que.push(P{d[e.to],e.to}); 57 } 58 } 59 } 60 } 61 62 int main() 63 { 64 ll st,ed; 65 V = read(),E = read(),st = read(),ed = read(); 66 // scanf("%d %d %d",&V,&E,&st); 67 _for(i,0,E) 68 { 69 ll s,t,c; 70 s = read(),t = read(),c = read(); 71 // scanf("%d %d %d",&s,&t,&c); 72 G[s].push_back(edge {t,c}); 73 G[t].push_back(edge{s,c}); 74 } 75 shortest_path(st); 76 write(d[ed]); 77 //printf("%d ",d[i]); 78 return 0; 79 }