#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=114514;
int n,m,k;
int cnt;
struct node{
int to;
int dis;
int next;
}edge[N*50];
int head[N];
void add(int a,int b,int c){
cnt++;
edge[cnt].dis=c;
edge[cnt].to=b;
edge[cnt].next=head[a];
head[a]=cnt;
}
int ans[N];
bool qd[N];
void dijkstra(int s,int t){
memset(ans,0x3f3f3f3f,sizeof(ans));
ans[s]=0;
int u=s;
while(1){
qd[u]=true;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
ans[v]=min(ans[v],ans[u]+edge[i].dis);
}
u=-1;
int a=0x3f3f3f3f;
for(int i=0;i<=k*n+n-1;i++){
if(qd[i]==false&&ans[i]<a){
a=ans[i];
u=i;
}
}
if(u==-1){
printf("%lld\n",ans[t]);
exit(0);
}
}
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&k);
int s,t;
scanf("%lld%lld",&s,&t);
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
for(int j=0;j<=k;j++){
add(a+j*n,b+j*n,c);
add(b+j*n,a+j*n,c);
}
for(int j=0;j<k;j++){
add(a+j*n,b+(j+1)*n,0);
add(b+j*n,a+(j+1)*n,0);
}
}
t=n*k+t;
dijkstra(s,t);
return 0;
}