1 #include<bits/stdc++.h>
2 using namespace std;
3
4 typedef long long ll;
5 const int maxn = 301005;
6 const int ad=5e5+4;
7 typedef pair<ll,int>pli;
8 struct Node
9 {
10 int y,val,next;
11 Node(int y=0,int val=0,int next=0):y(y),val(val),next(next) {}
12 } node[maxn<<1];
13
14 int head[ad<<1];
15 int cnt;
16 int n,m,f,s,t;
17 void add1(int x,int y,int val)
18 {
19 node[++cnt].y=y;
20 node[cnt].val=val;
21 node[cnt].next=head[x];
22 head[x]=cnt;
23 node[++cnt].y=y+ad;
24 node[cnt].val=val;
25 node[cnt].next=head[x+ad];
26 head[x+ad]=cnt;
27 }
28
29 void add2(int x,int y)
30 {
31 node[++cnt].y=y+ad;
32 node[cnt].val=0;
33 node[cnt].next=head[x];
34 head[x]=cnt;
35 }
36 priority_queue<pli,vector<pli>,greater<pli> >que;
37 bool vis[ad<<1];
38 ll dist[ad<<1];
39 void dijstra()
40 {
41 while(!que.empty())
42 que.pop();
43 memset(dist,0x3f,sizeof(dist));
44 memset(vis,0,sizeof(vis));
45 que.push(pli(0,s));
46 while(!que.empty())
47 {
48 pli tmp = que.top();
49 que.pop();
50 int k = tmp.second;
51 ll v = tmp.first;
52 if(vis[k])
53 continue;
54 vis[k]=1;
55 dist[k]=v;
56 for(int i=head[k]; i; i=node[i].next)
57 {
58 int to=node[i].y;
59 if(dist[to] > v+node[i].val)
60 {
61 que.push(pli(v+node[i].val,to));
62 }
63 }
64 }
65 }
66 int main()
67 {
68 scanf("%d%d%d%d%d",&n,&m,&f,&s,&t);
69 cnt = 0;
70 memset(head,0,sizeof(head));
71 for(int i=1; i<=m; i++)
72 {
73 int u,v,k;
74 scanf("%d%d%d",&u,&v,&k);
75 add1(u,v,k);
76 add1(v,u,k);
77 }
78 for(int i=1; i<=f; i++)
79 {
80 int u,v;
81 scanf("%d%d",&u,&v);
82 add2(u,v);
83 }
84 dijstra();
85 printf("%lld\n",min(dist[t],dist[ad+t]));
86 }