#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e4 + 10, M = 1e5 + 10;
typedef pair<int, int> PII;
int h[N], e[M], ne[M], w[M], idx;
int n, m, k;
int s, tar;
bool st[N];
long long dist[11][N];
void add(int a, int b, int c){
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}
void dijkstra(int u)
{
priority_queue<PII, vector<PII>, greater<PII>> heap;
dist[u][s] = 0;
heap.push({0, s});
for (int i = 0; i < n - 1; i ++ )
{
auto ver = heap.top();
heap.pop();
int t = ver.second;
for(int j = h[t]; ~j; j = ne[j]){
int k = e[j];
if(u == 0){
if(dist[u][t] + w[j] < dist[u][k]){
dist[u][k] = dist[u][t] + w[j];
heap.push({dist[u][k], k});
}
}
else{
if(dist[u][k] > min(dist[u - 1][t], dist[u][t] + w[j])){
dist[u][k] = min(dist[u - 1][t], dist[u][t] + w[j]);
heap.push({dist[u][k], k});
}
}
}
}
}
int main(){
cin >> n >> m >> k;
cin >> s >> tar;
memset(h, -1, sizeof h);
while(m --){
int a, b, c;
cin >> a >> b >> c;
add(a, b, c), add(b, a, c);
}
memset(dist, 0x3f, sizeof dist);
for(int i = 0; i <= k; i ++){
dijkstra(i);
}
cout << dist[k][tar];
return 0;
}