1 #include <cstdio>
2 #include <cstring>
3 #include <cctype>
4 #include <algorithm>
5 #include <queue>
6 #include <iostream>
7 using namespace std;
8
9 #define N 10010
10 #define M 100010
11 #define inf 0x3f3f3f3f
12 #define res register int
13 inline int read()
14 {
15 int x(0),f(1); char ch;
16 while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
17 while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
18 return f*x;
19 }
20
21 int n,m,k,s,t;
22 int head[N],ver[M<<1],nxt[M<<1],edge[M<<1];
23 int head2[N],ver2[M<<1],nxt2[M<<1],edge2[M<<1];
24 int tot,tot2;
25 inline void add(int x,int y,int z)
26 {
27 ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot ; edge[tot]=z;
28 ver2[++tot2]=x; nxt2[tot2]=head2[y]; head2[y]=tot2; edge2[tot2]=z;
29 }
30 int f[N],vis[N],dis[N];
31 struct node{
32 int id,dis;
33 bool operator <(const node &n2)const{
34 return dis>n2.dis;}
35 };
36 struct node2{
37 int id,h,g;
38 bool operator <(const node2 &n2)const{
39 return h+g>n2.h+n2.g;}
40 };
41
42 inline void get_f()
43 {
44 memset(f,0x3f,sizeof(f));
45 priority_queue<int,vector<int>,greater<int> > q;
46 q.push(t); f[t]=0; vis[t]=1;
47 while(q.size())
48 {
49 int x=q.top(); q.pop(); vis[x]=0;
50 for(res i=head2[x] ; ~i ; i=nxt2[i])
51 {
52 int y=ver2[i];
53 if(f[y]>f[x]+edge2[i])
54 {
55 f[y]=f[x]+edge2[i];
56 if(!vis[y])
57 vis[y]=1,q.push(y);
58 }
59 }
60 }
61 // if(f[s]==inf) {
62 // puts("-1"); exit(0);
63 // }
64 }
65
66
67
68 int cnt[N];
69 inline int dij()
70 {
71 priority_queue<node2> q;
72 memset(vis,0,sizeof(vis));
73 q.push((node2){s,0,f[s]});
74 while(q.size())
75 {
76 node2 now=q.top(); q.pop(); int x=now.id;
77 cnt[x]++;
78 if(cnt[x]==k && x==t) return now.h+now.g;
79 if(cnt[x]>k) continue;
80 for(res i=head[x] ; ~i ; i=nxt[i])
81 {
82 node2 tmp; int y=ver[i];
83 tmp.id=y;
84 tmp.h=now.h+edge[i];
85 tmp.g=f[y];
86 // tmp.dis=now.dis-f[x]+edge[i]+f[y];
87 q.push(tmp);
88 }
89 }
90 return -1;
91 }
92
93 int main()
94 {
95 n=read(); m=read();
96 memset(head,-1,sizeof(head));
97 memset(head2,-1,sizeof(head2));
98 for(res i=1 ; i<=m ; i++)
99 {
100 int x=read(),y=read(),z=read();
101 add(x,y,z);
102 }
103 s=read(); t=read(); k=read();
104 if(s==t) k++;
105 get_f();
106 printf("%d
",dij());
107 return 0;
108 }