#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
const int N = 1010, M = 200010;
int n, m, S, T, K;
int head[N], rhead[N], ver[M], edge[M], Next[M], tot;
int dist[N], cnt[N];
bool v[N];
void add(int head[],int x,int y,int z){
ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
}
//跑反图
void dijkstra()
{
//优先队列是一个vector,数组的每个格子存的是一个PII,greater是比较大小的函数
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({0, T});
memset(dist, 0x3f, sizeof dist);
dist[T] = 0;
while (heap.size())
{
auto t = heap.top();
heap.pop();
int ver1 = t.y; //取出点
if (v[ver1]) continue;
v[ver1] = 1;
for (int i = rhead[ver1]; i; i = Next[i])
{
int j = ver[i];
if (dist[j] > dist[ver1] + edge[i])
{
dist[j] = dist[ver1] + edge[i];
heap.push({dist[j], j});//入队
}
}
}
}
int astar()
{
priority_queue<PIII, vector<PIII>, greater<PIII>> heap;
heap.push({dist[S], {0, S}}); //相比上一个优先队列,多存了一个dist[]
while (heap.size())
{
auto t = heap.top();
heap.pop();
int ver1 = t.y.y, distance = t.y.x;
cnt[ver1] ++ ; //计数
if (cnt[T] == K) return distance;
for (int i = head[ver1]; i; i = Next[i])
{
int j = ver[i];
if (cnt[j] < K)
heap.push({distance + edge[i] + dist[j], {distance + edge[i], j}});
}
}
return -1;
}
int main()
{
cin>>n>>m;
memset(head, -1, sizeof head);
memset(rhead, -1, sizeof rhead);
for (int i = 0; i < m; i ++ )
{
int a, b, c;
cin>>a>>b>>c;
add(head, a, b, c);
add(rhead, b, a, c);
}
cin>>S>>T>>K;
if (S == T) K++ ;
dijkstra();
cout<<astar();
return 0;
}