//第k短路 #include<iostream> #include<queue> #include<vector> using namespace std; const int N=1000,inf=1000000000; bool final[N]; int dist[N]; struct edge{ int v,c; }; vector<edge> vec1[N],vec2[N]; void dijkstra(int src,int n){ int i,j,k,min; for(i=0;i<n;i++){ final[i]=false; dist[i]=inf; } dist[src]=0; for(i=0;i<n;i++){ min=inf; for(k=0;k<n;k++) if(!final[k]&&dist[k]<min){ j=k; min=dist[k]; } final[j]=true; for(k=0;k<vec2[j].size();k++) if(!final[vec2[j][k].v]&&dist[j]+vec2[j][k].c<dist[vec2[j][k].v]) dist[vec2[j][k].v]=dist[j]+vec2[j][k].c; } } struct node{ int v,l; node(int v,int l):v(v),l(l){} inline bool operator<(const node &a)const{ return l+dist[v]>a.l+dist[a.v]; } }; int A_star(int s,int t,int k){ int u,i,len,c[N]; if(dist[s]==inf) return -1; priority_queue<node> heap; memset(c,0,sizeof(c)); heap.push(node(s,0)); while(!heap.empty()){ u=heap.top().v; len=heap.top().l; heap.pop(); c[u]++; if(c[t]==k) return len; if(c[u]>k) continue; for(i=0;i<vec1[u].size();i++) heap.push(node(vec1[u][i].v,len+vec1[u][i].c)); } return -1; } int main(){ int u,v,c,n,m,k,src,dest,i,j; edge temp; while(scanf("%d%d",&n,&m)!=EOF){ for(i=0;i<n;i++){ vec1[i].clear(); vec2[i].clear(); } for(i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&c); temp.v=v-1; temp.c=c; vec1[u-1].push_back(temp); temp.v=u-1; temp.c=c; vec2[v-1].push_back(temp); } scanf("%d%d%d",&src,&dest,&k); src--; dest--; if(src==dest) k++; dijkstra(dest,n); printf("%d/n",A_star(src,dest,k)); } return 0; }