#include<bits/stdc++.h>
using namespace std;
long long k,n,m;
long long st,fi;
long long dis[1100004];
struct node{
long long this_dian,next_dian,next_bian,this_bian_long;
}edge[5500005];
long long cnt,h[5500005];
void add(long long u,long long v,long long w){
edge[++cnt].next_bian=h[u];
h[u]=cnt;
edge[cnt].next_dian=v;
edge[cnt].this_dian=u;
edge[cnt].this_bian_long=w;
}
queue<long long>q;
bool inq[1100004];
void spfa(){
q.push(st);
dis[st]=0;
while(!q.empty()){
long long u=q.front();
q.pop();
if(inq[u]){
continue;
}
inq[u]=true;
for(long long i=h[u];i!=-1;i=edge[i].next_bian){
long long v=edge[i].next_dian;
if(dis[v]>dis[u]+edge[i].this_bian_long){
dis[v]=dis[u]+edge[i].this_bian_long;
q.push(v);
}
}
}
}
int main(){
cin>>n>>m>>k;
for(long long i=0;i<=n*(k+1);i++){
dis[i]=1000000000001;
h[i]=-1;
}
cin>>st>>fi;
for(long long i=1;i<=m;i++){
long long x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
for(long long j=1;j<=k;j++){
add(x+j*n,y+j*n,z);
add(y+j*n,x+j*n,z);
add(x+(j-1)*n,y+j*n,0);
add(y+(j-1)*n,x+j*n,0);
}
}
for(int i=0;i<n;i++){
for(int j=1;j<=k;j++){
add(i+n*(j-1),i+n*j,0);
}
}
spfa();
cout<<dis[fi+n*k];
return 0;
}