#include<bits/stdc++.h>
using namespace std;
int const X=1e7+10;
int n,m,k,s,t,a,b,c,num;
int head[X];
long long dis[X];
bool vis[X];
struct edge{
int to,next,w;
};
edge e[X];
struct node{
int to,w;
bool operator<(const node &a) const{return w>a.w; }
};
priority_queue<node> q;
node temp;
void add(int a,int b,int c){
e[++num].next=head[a];
e[num].to=b;
e[num].w=c;
head[a]=num;
}
int main(){
cin>>n>>m>>k>>s>>t;
s++; t++;
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
b++; a++;
add(a,b,c);
add(b,a,c);
for(int j=1;j<=k;j++){
add(a+(j-1)*n,b+j*n,0);
add(b+(j-1)*n,a+j*n,0);
add(a+j*n,b+j*n,c);
add(b+j*n,a+j*n,c);
}
}
memset(dis,0x3f,sizeof(dis));
temp.to=s; temp.w=0;
q.push(temp);
dis[s]=0;
while(!q.empty()){
int u=q.top().to;
q.pop();
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i;i=e[i].next){
if(dis[e[i].to]>dis[u]+e[i].w){
dis[e[i].to]=dis[u]+e[i].w;
if(!vis[e[i].to]){
temp.to=e[i].to;
temp.w=e[i].w;
q.push(temp);
}
}
}
}
long long ans=INT_MAX;
for(int i=0;i<=k;i++){
ans=min(ans,dis[t+i*n]);
}
cout<<ans;
return 0;
}