1 #include<stdio.h>
2 #include<iostream>
3 #include<queue>
4 #include<string.h>
5 using namespace std;
6 #define inf 0x7ffffff
7 #define N 100010
8 #define M 1010
9 struct edge{
10 int w,to,next;
11 }e1[N],e2[N];
12 struct node{
13 int w,u;
14 bool operator <(const node &x)const
15 {
16 return w>x.w;
17 }
18 };
19 struct node1{
20 int f,g,u;
21 bool operator <(const node1 &x)const
22 {
23 return f>x.f;
24 }
25 };
26 int cnt;
27 int pre1[M],pre2[M],dist[M];
28 void add(int a,int b,int w)
29 {
30 e1[cnt].next=pre1[a];
31 e1[cnt].w=w;
32 e1[cnt].to=b;
33 pre1[a]=cnt;
34 e2[cnt].next=pre2[b];
35 e2[cnt].w=w;
36 e2[cnt].to=a;
37 pre2[b]=cnt++;
38 }
39 void dijstra(int s,int n,int pre[],edge e[])
40 {
41 priority_queue<node> q;
42 for(int i=0;i<=n;i++)
43 dist[i]=inf;
44 dist[s]=0;
45 node in;
46 in.w=0;
47 in.u=s;
48 q.push(in);
49 while(!q.empty())
50 {
51 node out=q.top();
52 q.pop();
53 int u=out.u;
54 int w=out.w;
55 for(int edg=pre[u];edg!=0;edg=e[edg].next)
56 {
57 int v=e[edg].to;
58 if(dist[v]>dist[u]+e[edg].w)
59 {
60 dist[v]=dist[u]+e[edg].w;
61 in.w=dist[v];
62 in.u=v;
63 q.push(in);
64 }
65 }
66 }
67 }
68 int Astar(int s,int t,int k,int pre[],edge e[])
69 {
70 priority_queue<node1> q;
71 int cnt1=0;
72 node1 in;
73 in.u=s;
74 in.g=0;
75 in.f=dist[s];
76 q.push(in);
77 while(!q.empty())
78 {
79 node1 out=q.top();
80 q.pop();
81 int g=out.g;
82 int u=out.u;
83 if(u==t)cnt1++;
84 if(cnt1==k)return out.f;
85 for(int edg=pre[u];edg!=0;edg=e[edg].next)
86 {
87 int v=e[edg].to;
88 in.u=v;
89 in.g=g+e[edg].w;
90 in.f=in.g+dist[v];
91 q.push(in);
92 }
93 }
94 return -1;
95 }
96 int main()
97 {
98 int m,n,k;
99 while(scanf("%d%d",&n,&m)!=EOF)
100 {
101 memset(pre1,0,sizeof(pre1));
102 memset(pre2,0,sizeof(pre2));
103 cnt=1;
104 int a,b,w;
105 while(m--)
106 {
107 scanf("%d%d%d",&a,&b,&w);
108 add(a,b,w);
109 }
110 int s,t,k;
111 scanf("%d%d%d",&s,&t,&k);
112 if(s==t)k++;
113 dijstra(t,n,pre2,e2);
114 printf("%d\n",Astar(s,t,k,pre1,e1));
115 }
116 return 0;
117 }