#include<bits/stdc++.h>
using namespace std;
const int N=1.2e5+4;
#define inf 2147483647
#define pii pair<int,int>
struct Edge{
int to,value;
};
vector<Edge>G[N];
int ans[N],minn;
bool vis[N];
priority_queue<pii,vector<pii>,greater<pii> >Q;
int n,m,k,u,v,w;
int s,t;
void add(int u,int v,int w){
G[u].push_back({v,w});
}
int main(){
cin>>n>>m>>k>>s>>t;
while(m--){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
for(int i=1;i<=k;i++){
add(u+i*n,v+i*n,w);
add(v+i*n,u+i*n,w);
add(u+i*n-n,v+i*n,0);
add(v+u*n-n,u+i*n,0);
/*
u=0,v=1;
连1和6,连1和5
*/
}
}
for(int i=0;i<=(k+1)*n;i++){
if(i!=s){
ans[i]=inf;
}
}
Q.push({ans[s],s});
while(!Q.empty()){
int u=Q.top().second;Q.pop();
if(vis[u]){
continue;
}
vis[u]=1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].to,w=G[u][i].value;
if(ans[v]>ans[u]+w){
ans[v]=ans[u]+w;
Q.push({ans[v],v});
}
}
}
minn=inf;
for(int i=0;i<=k;i++){
minn=min(minn,ans[t+i*n]);
}
cout<<minn;
return 0;
}