#include <bits/stdc++.h>
#include <queue>
using namespace std;
#define N 20005
#define add(u,v,w) e[u].push_back(node(v,w));
int n,m,k,st,ed,ans;
struct node{
int w,v;
node(){}
node(int vv,int ww):w(ww),v(vv){};
};
struct node2{
int d,u;
node2(int dd,int uu):d(dd),u(uu){};
};
bool operator < (node2 a,node2 b)
{
return a.d>b.d;
}
vector<node> e[N*11];
bool vst[N*11];
int d[N*11];
priority_queue<node2> q;
void dij()
{
memset(d,63,sizeof(d));
d[st]=0;
q.push(node2(0,st));
while(!q.empty())
{
int u=q.top().u;q.pop();
if(vst[u]) continue;
vst[u]=1;
for(auto i:e[u])
if(d[i.v]>d[u]+i.w)
{
d[i.v]=d[u]+i.w;
q.push(node2(d[i.v],i.v));
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m>>k;
cin>>st>>ed;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
for(int j=1;j<=k;j++)
{
add(u,n*j+v,0);
add(v,n*j+u,0);
add(n*j+u,n*j+v,w);
add(n*j+v,n*j+u,w);
}
}
dij();
int ans=INT_MAX;
for(int j=0;j<=k;j++)
ans=min(d[ed+n*j],ans);
cout<<ans;
return 0;
}