#include <iostream>
#include <queue>
using namespace std;
const int inf = 2147483647;
const int MAXX = 3e6 + 11;
int n,m,k,s,t,cnt;
int dis[MAXX];
int to[MAXX],nxt[MAXX],val[MAXX],h[MAXX];
bool vis[MAXX];
struct node {
int v,w;
friend bool operator < (node a,node b) {
return a.w > b.w;
}
} tmp;
priority_queue <node> q;
void add(int u,int v,int w) {
to[++ cnt] = v;
val[cnt] = w;
nxt[cnt] = h[u];
h[u] = cnt;
}
void dijkstra() {
for (int i = 1; i <= n; i ++) {
dis[i] = inf;
}
dis[s] = 0;
tmp.v = s,tmp.w = 0;
q.push(tmp);
while(!q.empty()) {
int u = q.top().v;
q.pop();
if (vis[u]) {
continue;
}
vis[u] = 1;
for (int i = h[u]; i; i = nxt[i]) {
if (dis[to[i]] > (long long)dis[u] + val[i]) {
dis[to[i]] = dis[u] + val[i];
tmp.w = dis[to[i]];
tmp.v = to[i];
q.push(tmp);
}
}
}
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n >> m >> k;
cin >> s >> t;
for (int i = 1,u,v,w; i <= m; i ++) {
cin >> u >> v >> w;
add(u,v,w);
add(v,u,w);
for (int j = 1; j <= k; j ++) {
add(u + j * n,v + j * n,w);
add(v + j * n,u + j * n,w);
add(u + j * n - n,v + j * n,0);
add(v + j * n - n,u + j * n,0);
}
}
dijkstra();
int ans = inf;
for (int i = 0; i <= k; i ++) {
if (dis[t + i * n] < ans) {
ans = dis[t + i * n];
}
}
cout << ans;
return 0;
}