#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10, M = 2e5+10;
typedef pair<int, int> PII; //距离 点
typedef pair<int, pair<int, int>> PIII; //当前距离+估计值 当前距离 点
int n, m, s, t, k;
int h[N], rh[N], ne[M], e[M], w[M], idx;
int dis[N];
bool vis[N];
int cnt[N];
void add(int h[], int a, int b, int c){
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void dijkstra(){
memset(dis, 0x3f, sizeof dis);
dis[t] = 0;
priority_queue<PII, vector<PII>, greater<PII> > q;
q.push({0, t});
while(q.size()){
PII tmp = q.top();
q.pop();
int u = tmp.second;
if(vis[u]) continue;
vis[u] = true;
for(int i=rh[u]; ~i; i=ne[i]){
int v = e[i];
if(vis[v]) continue;
if(dis[u]+w[i] < dis[v]){
dis[v] = dis[u]+w[i];
q.push({dis[v], v});
}
}
}
}
int astar(){
priority_queue<PIII, vector<PIII>, greater<PIII> > q;
q.push({dis[s], {0, s}});
while(q.size()){
PIII tmp = q.top();
q.pop();
int u = tmp.second.second, d = tmp.second.first;
cnt[u]++;
if(cnt[t]==k) return d;
for(int i=h[u]; ~i; i=ne[i]){
int v = e[i];
if(cnt[v]<k) q.push({d+w[i]+dis[v], {d+w[i], v}});
}
}
return -1;
}
int main(){
scanf("%d%d", &n, &m);
//这里正向建图和反向建图
//避免在搜索时出现从终点走到一个最近的点然后又走到终点的情况
memset(h, -1, sizeof h);
memset(rh, -1, sizeof rh);
int a, b, c;
for(int i=0; i<m; i++){
scanf("%d%d%d", &a, &b, &c);
add(h, a, b, c);
add(rh, b, a, c);
}
scanf("%d%d%d", &s, &t, &k);
if(s==t) k++;
dijkstra();
cout<< astar()<< endl;
return 0;
}