#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=pow(2,31)-1;
ll n,m,k;
ll s,t;
ll dis[2000100],vis[2000100];
struct list{
ll to,nxt,value,h;
}edge[2000100];
ll cnt=0;
void add(ll a,ll b,ll c){
edge[++cnt].to=b;
edge[cnt].value=c;
edge[cnt].nxt=edge[a].h;
edge[a].h=cnt;
}
struct node{
ll v,dis;
friend bool operator<(node a,node b){
return a.dis>b.dis;
}
};
priority_queue<node>q;
void dijkstra(){
for(ll i=0;i<=(n-1)+k*n;i++){
dis[i]=inf;
}
dis[s]=0;
q.push(node{s,0});
while(!q.empty()){
ll u=q.top().v;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(ll i=edge[u].h;i;i=edge[i].nxt){
ll v=edge[i].to;
if(dis[v]>(ll)dis[u]+edge[i].value){
dis[v]=dis[u]+edge[i].value;
q.push(node{v,dis[v]});
}
}
}
}
int main(){
cin>>n>>m>>k;
cin>>s>>t;
for(ll i=1,a,b,c;i<=m;i++){
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
for(ll j=1;j<=k;j++){
add(a+j*n,b+j*n,c);
add(b+j*n,a+j*n,c);
add(a+j*n-n,b+j*n,0);
add(b+j*n-n,a+j*n,0);
}
}
dijkstra();
ll ans=inf;
for(ll i=0;i<=k;i++){
ans=min(ans,dis[t+i*n]);
}
cout<<ans;
return 0;
}