#include <bits/stdc++.h>
using namespace std;
#define MAXN 110001
#define MAXM 1050001
using Pair = pair<int, int>;
int n, m, k, s, t, u, v, w;
int dis[MAXN];
bitset<MAXN> vis;
priority_queue<Pair, vector<Pair>, greater<Pair>> pq;
struct Edge{
int v, w;
};
vector<Edge> e[MAXN];
void dijkstra(){
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
while (!pq.empty()) pq.pop();
pq.push(make_pair(0, s));
while (!pq.empty()){
u = pq.top().second;
pq.pop();
if (vis[u]) continue;
vis[u] = true;
for (auto i: e[u]){
v = i.v;
if (dis[v] > dis[u] + i.w){
dis[v] = dis[u] + i.w;
pq.push(make_pair(dis[v], v));
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k >> s >> t;
while (m--){
cin >> u >> v >> w;
e[u].push_back({v, w});
e[v].push_back({u, w});
for (int i(1); i<=k; ++i){
e[i*n+u].push_back({i*n+v, w});
e[i*n+v].push_back({i*n+u, w});
}
for (int i(0); i<k; ++i){
e[i*n+v].push_back({(i+1)*n+v, 0});
e[i*n+u].push_back({(i+1)*n+u, 0});
}
}
for (int i=1; i<=k; ++i) e[t+(i-1)*n].push_back({t+i*n, 0});
dijkstra();
cout << dis[t+k*n];
return 0;
}