#include <bits/stdc++.h>
using namespace std;
const int N=1e7;
struct edge {
int v,w,h;
} e[100010];
int n,m,K,s,t,cnt,h[10010],d[10010][11];
bool vis[10010][11];
struct node{
int u,k;
bool operator <(const node &x) const {
return d[u][k]>d[x.u][x.k];
}
};
inline void add(int u,int v,int w) {
e[++cnt]=(edge){v,w,h[u]};
h[u]=cnt;
}
inline void dijkstra() {
priority_queue<node>q;
memset(d,0x3f,sizeof(d));
q.push((node){s,0});
d[s][0]=0;
vis[s][0]=1;
while(!q.empty()){
node x=q.top();
q.pop();
vis[x.u][x.k]=0;
for (int i=h[x.u],v,u,k;i;i=e[i].h){
u=x.u,k=x.k,v=e[i].v;
if (d[v][k]>d[u][k]+e[i].w){
d[v][k]=d[u][k]+e[i].w;
if (!vis[v][k]){
q.push((node){v,k});
}vis[v][k]=1;
}if (d[v][k+1]>d[u][k]){
d[v][k+1]=d[u][k];
if (!vis[v][k+1]&&k<K){
q.push((node){v,k+1});
}vis[v][k+1]=1;
}
}
}
}
int main() {
cin >>n>>m>>K>>s>>t;
for (int i=1,u,v,w;i<=m;i++){
cin >>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dijkstra();
int ans=1e9;
for (int i=0;i<=K;i++){
ans=ans<d[t][i]? ans:d[t][i];
}
cout <<ans;
}