1 /*
2 题意:最短路
3 思路:spfa
4 时间:2018.07.18
5 */
6 #include <bits/stdc++.h>
7 using namespace std;
8
9 typedef long long LL;
10 const int MAXN=100005;
11 const LL MOD7 = 1e9+7;
12
13 struct Edge
14 {
15 int u,v,c;
16 int next;
17 }edge[2*MAXN];
18 int head[MAXN];
19 int cnt;
20
21 int dis[MAXN];
22 int vis[MAXN];
23 int num[MAXN];
24 int n,m;
25
26 void init()
27 {
28 cnt=0;
29 memset(head,-1,sizeof(head));
30 }
31
32 void addEdge(int u,int v,int c)
33 {
34 edge[cnt].u=u;edge[cnt].v=v;edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++;
35 }
36
37 void spfa(int st,int et)
38 {
39 queue<int> q;
40 memset(vis,0,sizeof(vis));
41 memset(dis,-1,sizeof(dis));
42 memset(num,0,sizeof(num));
43 while (!q.empty()) q.pop();
44 q.push(st);
45 dis[st]=0;
46 vis[st]=1;
47 num[st]=1;
48 while (!q.empty())
49 {
50 int u=q.front();q.pop();
51 // if (u==et) break;
52 vis[u]=0;
53 for (int i=head[u];i!=-1;i=edge[i].next)
54 {
55 int v=edge[i].v;
56 int c=edge[i].c;
57 if (dis[v]==-1 || dis[u]+c<dis[v])
58 {
59 dis[v]=dis[u]+c;
60 if (!vis[v])
61 {
62 vis[v]=1;
63 q.push(v);
64 if (++num[v]>n) break;
65 }
66 }
67 }
68 }
69 printf("%d\n",dis[et]);
70 }
71
72 int main()
73 {
74 #ifndef ONLINE_JUDGE
75 freopen("test.txt","r",stdin);
76 #endif // ONLINE_JUDGE
77 int st,et;
78 scanf("%d%d",&n,&m);
79 scanf("%d%d",&st,&et);
80 init();
81 int u,v,c;
82 for (int i=1;i<=m;++i)
83 {
84 scanf("%d%d%d",&u,&v,&c);
85 addEdge(u,v,c);
86 addEdge(v,u,c);
87 }
88 spfa(st,et);
89 return 0;
90 }