1 #include <iostream>
2 #include <algorithm>
3 #include <queue>
4 #include <stdio.h>
5 using namespace std;
6 int m,n,s,t,k;
7 #define M 100005
8 #define N 1005
9 #define INF 100000000
10 int dis[N];
11 struct edge
12 {
13 int v,val,next;//边的终点,边权
14 edge(){}
15 edge(int _v,int _val,int _next){v=_v,val=_val,next=_next;}
16 }line[M],_line[M];
17 int head[M],_head[M];
18
19 struct dijnode
20 {
21 int v,dis;
22 dijnode(){}
23 dijnode(int _v,int _dis){v=_v,dis=_dis;}
24 friend bool operator <(const dijnode &a,const dijnode &b)
25 {
26 return a.dis>b.dis;
27 }
28 };
29 struct Anode
30 {
31 int v,g,h;//v:当前点 g:起点到点v距离 h:点v到终点距离
32 Anode(){}
33 Anode(int _v,int _g,int _h){v=_v,g=_g;h=_h;}
34 friend bool operator <(const Anode&a,const Anode&b)
35 {
36 return a.h+a.g>b.h+b.g;
37 }
38 };
39 void input(){
40 memset(head,-1,sizeof(head));
41 memset(_head,-1,sizeof(_head));
42 int u,v,val;
43 int e=0,_e=0;
44 for(int i=0;i<m;i++)
45 {
46 scanf("%d%d%d",&u,&v,&val);
47 line[e]=edge(v,val,head[u]);
48 head[u]=e++;
49 _line[_e]=edge(u,val,head[v]);
50 _head[v]=_e++;
51 }
52 }
53 int vis[N];
54 void dijkstra()
55 {
56 memset(vis,0,sizeof(vis));
57 priority_queue<dijnode>pq;
58 for(int i=0;i<n;i++)
59 dis[i]=INF;
60
61 dijnode node =dijnode(t,0);
62 dis[t]=0;
63 pq.push(node);
64
65 while(!pq.empty())
66 {
67 dijnode tmp = pq.top();
68 pq.pop();
69
70 if(vis[tmp.v])continue;
71 vis[tmp.v]=1;
72 for(int i=_head[tmp.v];i!=-1;i=_line[i].next)
73 {
74 if(tmp.dis+_line[i].val<dis[_line[i].v])
75 {
76 dis[_line[i].v]=tmp.dis+_line[i].val;
77 pq.push(dijnode(_line[i].v,dis[_line[i].v]));
78 }
79 }
80 }
81 for(int i=1;i<=n;i++)printf("%d\n",dis[i]);
82
83 }
84 int kcnt[N];
85 int Astar()
86 {
87 if(dis[s]>=INF)return -1;
88 memset(kcnt,0,sizeof(kcnt));
89 priority_queue<Anode> pq;
90 pq.push(Anode(s,0,dis[s]));
91 Anode node;
92 while(!pq.empty())
93 {
94 node = pq.top();
95 pq.pop();
96 if(kcnt[node.v]>=k)continue;
97
98 kcnt[node.v]++;
99 if(kcnt[t]>=k)return node.g;
100 for(int i=head[node.v];i!=-1;i = line[i].next)
101 {
102 pq.push(Anode(line[i].v,node.g+line[i].val,dis[line[i].v]));
103 }
104 }
105 return -1;
106
107 }
108 int main(int argc, const char * argv[])
109 {
110
111 while(scanf("%d%d",&n,&m)!=EOF)
112 {
113 input();
114 scanf("%d%d%d",&s,&t,&k);
115 dijkstra();
116 printf("%d\n",Astar());
117 }
118 }