#include<bits/stdc++.h>
using namespace std;
struct node{
int toi,toj,w;
bool operator<(const node& gama)const{
return w<gama.w;
}
bool operator>(const node& nama)const{
return w>nama.w;
}
};
priority_queue<node,vector<node>,greater<node> >q;
int n,m,k,d[15][10005],s,t,ans=2147483647;
bool f[15][10005];
vector<node>a[15][10005];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(d,0x3f,sizeof d);
cin>>n>>m>>k>>s>>t;
if(s==t){
cout<<0;
return 0;
}
d[0][s]=0;
q.push(node{0,s,0});
for(int i=1;i<=m;i++){
int u,v,p;
cin>>u>>v>>p;
for(int j=0;j<=k;j++){
a[j][u].push_back(node{j,v,p});
a[j][v].push_back(node{j,u,p});
if(j==k)break;
a[j][u].push_back(node{j+1,v,0});
a[j][v].push_back(node{j+1,u,0});
}
}
for(int i=0;i<=k;i++){
for(int j=0;j<n;j++){
while(!q.empty()&&f[q.top().toi][q.top().toj])q.pop();
int t1=q.top().toi,t2=q.top().toj;
f[t1][t2]=true;
q.pop();
for(int k=0;k<a[t1][t2].size();k++){
if(d[a[t1][t2][k].toi][a[t1][t2][k].toj]>d[t1][t2]+a[t1][t2][k].w){
d[a[t1][t2][k].toi][a[t1][t2][k].toj]=d[t1][t2]+a[t1][t2][k].w;
q.push(node{a[t1][t2][k].toi,a[t1][t2][k].toj,d[a[t1][t2][k].toi][a[t1][t2][k].toj]});
}
}
}
}
for(int i=0;i<=k;i++){
ans=min(ans,d[i][t]);
}
cout<<ans;
return 0;
}