#include <bits/stdc++.h>
using namespace std;
const int N = 5e6 + 10, M = 7e6 + 10;
struct edge {
int to, dis, nxt;
} e[M];
int head[N], cnt;
struct node {
int dis, pos;
bool operator < (const node x) const {
return dis > x.dis;
}
};
int dis[N];
bool vis[N];
int n, m, k, u, v, w, s, t;
void add(int u, int v, int w) {
cnt ++, e[cnt].to = v, e[cnt].dis = w, e[cnt].nxt = head[u], head[u] = cnt;
return ;
}
void dijkstra(int s) {
memset(dis, 0x3f, sizeof dis);
priority_queue<node> q;
dis[s] = 0;
q.push({0, s});
while(q.size()) {
node now = q.top();
q.pop();
int u = now.pos;
if(vis[u]) continue;
vis[u] = true;
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(dis[v] > dis[u] + e[i].dis) {
dis[v] = dis[u] + e[i].dis;
q.push({dis[v], v});
}
}
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
scanf("%d %d", &s, &t);
memset(head, -1, sizeof head);
s ++, t ++;
for(int i = 1; i <= m; i ++) {
scanf("%d %d %d", &u, &v, &w);
u ++, v ++;
add(u, v, w);
add(v, u, w);
for(int j = 1; j <= k; j ++) {
add(u + (j - 1) * n, v + j * n, 0);
add(v + (j - 1) * n, u + j * n, 0);
add(u + j * n, v + j * n, w);
add(u + j * n, v + j * n, w);
}
}
for(int i = 1; i <= k; i ++) {
add(t + (i - 1) * n, t + i * n, 0);
}
dijkstra(s);
printf("%d", dis[t + k * n]);
return 0;
}