#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e8;
int n,m,k,s,t;
struct node{
int v,w;
friend bool operator <(node a,node b){
return a.w > b.w;
}
};
struct edge{
int to,w,next;
}e[maxn<<1];
int cnt = 1;
int head[maxn];
void add(int u,int v,int w){
e[cnt].to = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt++;
}
int vis[maxn];
int dis[maxn];
void dijstra(int s)
{
priority_queue<node> q;
for(int i=1;i<=n*k + t;i++){
dis[i] = 0x3f3f3f3f;
}
dis[s] = 0;
q.push({s,0});
while(!q.empty()){
int now = q.top().v;
q.pop();
if(vis[now]==1) continue;
vis[now] = 1;
for(int i=head[now];i;i=e[i].next){
int tx = e[i].to;
if(dis[tx] > dis[now] + e[i].w){
dis[tx] = dis[now] + e[i].w;
q.push({tx,dis[tx]});
}
}
}
}
void run(){
cin>>n>>m>>k>>s>>t;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
for(int j=0;j<=k;j++){
add(u + j*n, v + j*n, w);
add(v + j*n, u + j*n, w);
if(j!=k){
add(u + j*n, v + (j+1)*n, 0);
add(v + j*n, u + (j+1)*n, 0);
}
}
}
dijstra(s);
int ans = 0x3f3f3f3f;
for(int i=0;i<=k;i++){
ans = min(ans,dis[n*i + t]);
}
cout<<ans<<"\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
while(T --){
run();
}
return 0;
}