#include<bits/stdc++.h>
using namespace std;
const int N=7e5;
long long INF=0x7fffffff;
struct edge{int y,n;long long z;}e[N<<1];
int n,m,k,lea,acc;
int head[N],cnt;
bool vis[22][N];
long long dis[22][N];
int q[2][N<<6];
int fr,ta;
void ad(int x,int y,long long z)
{
e[++cnt].n=head[x];
e[cnt].y=y;
e[cnt].z=z;
head[x]=cnt;
}
void init()
{
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&lea,&acc);
int x=0,y=0;
INF=INF*INF;
long long z=0;
for(int i=1;i<=m;++i)
{
scanf("%d%d%lld",&x,&y,&z);
ad(x,y,z);
ad(y,x,z);
}
}
void sp()
{
int i,j;
for(i=0;i<n;++i)
for(j=0;j<=k;++j)
dis[j][i]=INF;
dis[0][lea]=0;
fr=1;
ta=0;
++ta;
q[0][ta]=lea;
q[1][ta]=0;
while(fr<=ta)
{
int u=q[0][fr],st=q[1][fr];
++fr;
vis[st][u]=false;
for(i=head[u];i;i=e[i].n)
{
int v=e[i].y;
if(st<k)
{
if(dis[st+1][v]>dis[st][u])
{
dis[st+1][v]=dis[st][u];
if(vis[st+1][v]==false)
{
vis[st+1][v]=true;
++ta;
q[0][ta]=v;
q[1][ta]=st+1;
}
}
}
if(dis[st][v]>dis[st][u]+e[i].z)
{
dis[st][v]=dis[st][u]+e[i].z;
if(vis[st][v]==false)
{
++ta;
vis[st][v]=true;
q[0][ta]=v;
q[1][ta]=st;
}
}
}
}
}
void work()
{
long long ans=INF;
sp();
for(int i=0;i<=k;++i)
ans=min(ans,dis[i][acc]);
cout<<ans;
}
int main()
{
init();
work();
return 0;
}