#include <bits/stdc++.h>
#define ll long long
const int N=1e6+10;
using namespace std;
int k,n,m,x,y,s,e,w,d[N][5],vis[N][5],ans,sum;
struct ed{
int v,w;
};
struct node{
int v,w,cnt;
};
bool operator<(node x,node y){
return x.w>y.w;
}
vector<ed> G[N];
void dks(int s){
priority_queue<node> q;
d[s][0]=0;
node a={s,0,0};
q.push(a);
while(!q.empty()){
auto t=q.top();
q.pop();
int u=t.v,ncnt=t.cnt;
if(vis[u][ncnt])
continue;
vis[u][ncnt]=1;
for(auto i:G[u]){
int v=i.v,w=i.w;
if(ncnt<k&&!vis[v][ncnt+1]&&d[v][ncnt+1]>d[u][ncnt]){
d[v][ncnt+1]=d[u][ncnt];
node a={v,d[v][ncnt+1],ncnt+1};
q.push(a);
}
if(!vis[v][ncnt]&&d[v][ncnt]>d[u][ncnt]+w){
d[v][ncnt]=d[u][ncnt]+w;
node a={v,d[v][ncnt],ncnt};
q.push(a);
}
}
}
}
int main(){
memset(d,0x3f,sizeof(d));
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&e);
s++,e++;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
x++,y++;
G[x].push_back({y,w});
G[y].push_back({x,w});
}
dks(s);
ans=0x3f3f3f3f;
for(int i=0;i<=k;i++)
ans=min(ans,d[e][i]);
printf("%d",ans);
return 0;
}