#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
const ll N=1e4+10;
ll dis[11*N];
ll n,m,k,st,ed;
bool vis[11*N];
struct pst{
ll v,w;
};
vector<pst> g[N*11];
priority_queue<pair<ll,ll>> que;
void dij(ll s)
{
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
que.push({0,s});
while(!que.empty())
{
ll x=que.top().second;
que.pop();
if(!vis[x])
{
vis[x]=true;
for(int i=0;i<g[x].size();i++)
{
pst k=g[x][i];
ll y=k.v;
ll z=k.w;
if(dis[x]+z<dis[y])
{
dis[y]=dis[x]+z;
que.push(make_pair(-dis[y],y));
}
}
}
}
return;
}
int main()
{
cin>>n>>m>>k>>st>>ed;
while(m--)
{
int u,v,w;
cin>>u>>v>>w;
for(int i=0;i<=k;i++)
{
g[u+i*n].push_back((pst){v+i*n,w});
g[v+i*n].push_back((pst){u+i*n,w});
if(i!=k)
{
g[u+i*n].push_back((pst){v+(i+1)*n,0});
g[v+i*n].push_back((pst){u+(i+1)*v,0});
}
}
}
dij(st);
ll ans=0x3f3f3f3f3f3f3f3f;
for(int i=0;i<=k;i++)
{
ans=min(ans,dis[ed+i*n]);
}
cout<<ans;
return 0;
}