#include <bits/stdc++.h>
using namespace std;
int N, M, K;
int d[3000005] = {0};
struct edge
{
int to;
int w;
edge() {}
edge(int to, int w) : to(to), w(w) {}
};
struct node
{
int id;
int dis;
bool operator<(const node B) const
{
return dis > B.dis;
}
node() {}
node(int id, int dis) : id(id), dis(dis) {}
};
short int done[3000005] = {0};
void dijkstra(int x);
vector<edge> vec[3000005];
const int INF = 1e9;
int main()
{
int s, t;
for (int i = 0; i <= 3000000; i++)
{
d[i] = INF;
}
scanf("%d%d%d", &N, &M, &K);
scanf("%d%d", &s, &t);
s++;
t++;
for (int i = 1; i <= M; i++)
{
int x, y, w;
scanf("%d%d%d", &x, &y, &w);
x++;
y++;
for (int j = 0; j <= K; j++)
{
vec[x + j * N].push_back(edge(y + j * N, w));
vec[y + j * N].push_back(edge(x + j * N, w));
}
}
for (int i = 0; i <= K - 1; i++)
{
for (int j = 1; j <= N; j++)
{
int si = vec[j].size();
for (int k = 0; k < si; k++)
{
vec[j + i * N].push_back(edge(vec[j + i * N][k].to + N, 0));
}
vec[j + i * N].push_back(edge(j + i * N + N, 0));
}
}
dijkstra(s);
printf("%d", d[t + K * N]);
}
void dijkstra(int x)
{
priority_queue<node> Q;
Q.push(node(x, 0));
d[x] = 0;
while (Q.empty() != 1)
{
if (done[Q.top().id] == 1)
{
Q.pop();
continue;
}
done[Q.top().id] = 1;
int u = Q.top().id;
int dd = Q.top().dis;
for (int i = 0; i < vec[u].size(); i++)
{
if (d[vec[u][i].to] > dd + vec[u][i].w)
{
d[vec[u][i].to] = dd + vec[u][i].w;
Q.push(node(vec[u][i].to, d[vec[u][i].to]));
}
}
Q.pop();
}
}