#include<bits/stdc++.h>
#include<cstring>
using namespace std;
const int N = 2e6 + 10;
const int M = 4e5 + 10;
const int MAX = INT_MAX - 1e6;
const int fx[] = {0, 0, -1, 1};
const int fy[] = {1, -1, 0, 0};
const long long INF = 1e18+17;
#define ull unsigned long long
#define int long long
#define ri register
#define il inline
#define lowbit(x) x & -x
#define sr(x) ((x << 1) | 1)
#define sl(x) (x << 1)
#define mid ((l + r) >> 1)
#define fson 1, n, 1
#define lson l, mid, sr(k)
#define rson mid + 1, r, sl(k)
#define mpr make_pair
struct Edge {
int to, nxt, val;
}edge[N * 10];
int head[N], num_edge;
void add_edge(int x, int y, int z) {
edge[++ num_edge].to = y;
edge[num_edge].val = z;
edge[num_edge].nxt = head[x];
head[x] = num_edge;
return ;
}
int n, m, k, ks, js;
int dis[N];
bool vis[N];
priority_queue<pair<int ,int > > tea;
void work();
signed main(){
cin >> n >> m >> k;
cin >> ks >> js;
for (int i = 1, tmpx, tmpy, tmpz; i <= m; ++ i) {
scanf("%d%d%d", &tmpx, &tmpy, &tmpz);
add_edge(tmpx, tmpy, tmpz);
add_edge(tmpy, tmpx, tmpz);
for (int j = 1; j <= k; ++ j) {
tmpx += n;
tmpy += n;
add_edge(tmpx - n, tmpy, 0);
add_edge(tmpy - n, tmpx, 0);
add_edge(tmpx, tmpy, tmpz);
add_edge(tmpy, tmpx, tmpz);
}
}
for(int i = 1; i <= k; ++ i) {
add_edge(js + (i - 1) * n, js + i * n, 0);
}
work();
cout << dis[js + k * n];
return 0;
}
void work() {
for (int i = 1; i < N - 10; ++ i) {
dis[i] = MAX;
}
dis[ks] = 0;
tea.push(make_pair(0, ks));
for (int now; !tea.empty(); ) {
now = tea.top().second;
tea.pop();
if (vis[now])continue;
vis[now] = true;
for (int i = head[now], to, val; i; i = edge[i].nxt) {
to = edge[i].to;
val = edge[i].val;
if (dis[to] > dis[now] + val) {
dis[to] = dis[now] + val;
tea.push(make_pair(-dis[to], to));
}
}
}
return ;
}