#include <queue>
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <cstring>
#include<tuple>
using namespace std;
const long long N = 1e4 + 1;
const long long M = 1e5;
long long to[M];
long long nex[M];
long long w[M];
long long head[N];
long long cnt = 0;
long long dis[N][20];
long long visit[N][20];
void built(long long u, long long v, long long w1) {
nex[cnt] = head[u];
to[cnt] = v;
w[cnt] = w1;
head[u] = cnt++;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for (long long i = 0; i < N; i++) {
for (long long j = 0; j < 10; j++) {
dis[i][j] = 0x3f3f3f3f;
}
}
memset(head, -1, sizeof(head));
long long n, m, k, s, e;
cin >> n >> m >> k >> s >> e;
for (long long i = 0; i < m; i++) {
long long a, b; long long c;
cin >> a >> b >> c;
built(a, b, c);
built(b, a, c);
}
auto cmp = [](auto& a, auto& b) {
return get<2>(a) > get<2>(b);
};
priority_queue<tuple<long long , long long , long long >,
vector<tuple<long long , long long , long long >>, decltype(cmp)>
q(cmp);
q.emplace(s, 0, 0);
while (!q.empty()) {
long long cur = get<0>(q.top());
long long ft = get<1>(q.top());
long long c = get<2>(q.top());
q.pop();
if (visit[cur][ft])
continue;
visit[cur][ft] = 1;
if (cur == e) {
cout << c;
return 0;
}
for (long long i = head[cur]; i != -1; i = nex[i]) {
if (!visit[to[i]][ft] && w[i] + c < dis[to[i]][ft]) {
dis[to[i]][ft] = w[i] + c;
q.emplace(to[i], ft, dis[to[i]][ft]);
}
if (ft < k && !visit[to[i]][ft + 1] && c < dis[to[i]][ft + 1]) {
dis[to[i]][ft + 1] = c;
q.emplace(to[i], ft + 1, dis[to[i]][ft + 1]);
}
}
}
return 0;
}