#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
using namespace std;
int vet[400005], lon[400005], head[100005], nxt[400005], num, n, m, s, x, y, z,
dis[100005], f[10005][15], e, k;
struct node{
int dis, u;
bool operator < (node x) const{
return dis > x.dis;
}
};
priority_queue <node> heap;
void add(int u, int v, int c){
num ++;
vet[num] = v; lon[num] = c;
nxt[num] = head[u];
head[u] = num;
}
void Dijkstra(int s){
memset(dis, 127, sizeof(dis));
dis[s] = 0;
f[s][0] = 0;
node now;
now.u = s; now.dis = 0;
heap.push(now);
while(!heap.empty()){
now = heap.top();
heap.pop();
int u = now.u, d = now.dis;
if(d != dis[u]) continue;
for(int i = head[u]; i; i = nxt[i]){
int v = vet[i];
if(dis[u] + lon[i] < dis[v]){
dis[v] = dis[u] + lon[i];
now.u = v; now.dis = dis[v];
heap.push(now);
f[v][0] = dis[v];
for(int j = 1; j <= k; j++)
f[v][j] = min(f[v][j], min(f[u][j] + lon[i], f[u][j-1]));
}
}
}
}
int main(){
scanf("%d%d%d", &n, &m, &k);
scanf("%d%d", &s, &e);
for(int i = 1; i <= m; i++){
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
add(y, x, z);
}
memset(f, 127, sizeof(f));
int ans = f[1][1];
Dijkstra(s);
for(int i = 0; i <= k; i++)
ans = min(ans, f[e][i]);
printf("%d", ans);
return 0;
}