#include<bits/stdc++.h>
#define piii pair<int, pair<int, int>>
#define pii pair<int, int>
#define fst first
#define scd second
using namespace std;
const int N = 1e4 + 10;
const int M = 5e4 + 10;
int n, m, k, s, t, head[N], tot;
struct Edge{ int to, next, dis; }edge[M << 1];
void add(int x, int y, int z) {
edge[++tot] = {y, head[x] ,z};
head[x] = tot;
}
int dp[N][15], vis[N][15];
priority_queue<piii> q;
void Dijkstra() {
memset(dp, 0x3f, sizeof dp);
dp[s][0] = 0;
q.push({0, {s, 0}});
while(!q.empty()) {
pii u = q.top().scd; q.pop();
if(vis[u.fst][u.scd]) continue;
vis[u.fst][u.scd] = 1;
for(int i = head[u.fst]; i; i = edge[i].next) {
int v = edge[i].to, cnt = u.scd;
if(cnt < k && dp[v][cnt + 1] > dp[u.fst][cnt]) {
dp[v][cnt + 1] = dp[u.fst][cnt];
q.push({-dp[v][cnt + 1], {v, cnt + 1}});
}
if(dp[v][cnt] > dp[u.fst][cnt] + edge[i].dis) {
dp[v][cnt] = dp[u.fst][cnt] + edge[i].dis;
q.push({-dp[v][cnt], {v, cnt}});
}
}
}
}
int main() {
scanf("%d%d%d%d%d", &n, &m, &k, &s, &t);
for(int i = 1, x, y, z; i <= m; i++) {
scanf("%d%d%d", &x, &y, &z);
add(x, y, z); add(y, x, z);
}
Dijkstra();
int mn = 2e9;
for(int i = 0; i <= k; i++)
mn = min(mn, dp[t][k]);
printf("%d", mn);
return 0;
}