#include<bits/stdc++.h>
#define MAXN (10000*11+5)
using namespace std;
int h[MAXN],path[MAXN],etot;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
struct ee{
int u;
int w;
int next;
}edge[30*MAXN];
void add_edge(int x,int y,int val){
edge[etot]=(ee){y,val,h[x]};
h[x]=etot++;
}
int main(){
int n,m,k,s,t;
scanf("%d %d %d",&n,&m,&k);
scanf("%d %d",&s,&t);
for(int i=0;i<=n*(k+1)-1;i++){
h[i]=-1;
path[i]=0x3f3f3f3f;
}
path[s]=0;
int a,b,c;
for(int i=1;i<=m;i++){
scanf("%d %d %d",&a,&b,&c);
for(int i=0;i<=k;i++){
add_edge(a+i*n,b+i*n,c);
add_edge(b+i*n,a+i*n,c);
}
for(int i=1;i<=k;i++){
add_edge(a+(i-1)*n,b+i*n,0);
}
}
for(int i=1;i<=k;++i) add_edge(t+(i-1)*n,t+i*n,0);
q.push(make_pair(s,path[s]));
int Node,Path;
while(!q.empty()){
Node=q.top().first;
Path=q.top().second;
q.pop();
if(Path==path[Node]){
for(int i=h[Node];i!=-1;i=edge[i].next){
if(path[edge[i].u]>Path+edge[i].w){
path[edge[i].u]=Path+edge[i].w;
q.push(make_pair(edge[i].u,path[edge[i].u]));
}
}
}
}
printf("%d",path[n*k+t]);
return 0;
}