#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int to, w;
};
vector<node> vec[300100];
int vis[300100], dis[300100];
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
int s, t;
cin >> s >> t;
for(int i=1; i<=m; ++i) {
int u, v, w;
cin >> u >> v >> w;
vec[u].push_back({v,w});
vec[v].push_back({u,w});
for(int j=1; j<=k; ++j) {
vec[v].push_back({u+n*j,0});
vec[u].push_back({v+n*j,0});
vec[v+n*j].push_back({u+n*j,w});
vec[u+n*j].push_back({v+n*j,w});
}
}
for(int i=1; i<=k; ++i) {
vec[t+n*(i-1)].push_back({t+n*i,0});
}
priority_queue<pair<int,int> > que;
que.push({0, s});
memset(dis, 0x3f, sizeof dis);
dis[s] = 0;
while(!que.empty()) {
int index = que.top().second; que.pop();
if(vis[index]) continue;
vis[index] = 1;
for(int i=0; i<vec[index].size(); ++i) {
if(dis[vec[index][i].to] > dis[index] + vec[index][i].w) {
dis[vec[index][i].to] = dis[index] + vec[index][i].w;
que.push({-dis[vec[index][i].to], vec[index][i].to});
}
}
}
t = t+k*n;
cout << dis[t];
return 0;
}