#include<bits/stdc++.h>
using namespace std;
const int maxn=7e6+8;
int n,p,k,tot,s,t;
int Head[maxn],dis[maxn];
priority_queue<pair<int,int>> q;
struct add_Edge
{
int next,to,dis;
}Edge[maxn];
inline void add(int x,int y,int z)
{
Edge[++tot].next=Head[x];
Edge[tot].dis=z;
Edge[tot].to=y;
Head[x]=tot;
}
inline void dijkstra()
{
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push({0,s});
while(!q.empty())
{
int u1=q.top().first;
int u2=q.top().second;
q.pop();
if(u1+dis[u2])continue;
for(int i=Head[u2];i;i=Edge[i].next)
if(dis[Edge[i].to]>dis[u2]+Edge[i].dis)
{
dis[Edge[i].to]=dis[u2]+Edge[i].dis;
q.push({-dis[Edge[i].to],Edge[i].to});
}
}
}
inline unsigned long long read()
{
unsigned long long x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
signed main()
{
n=read(),p=read(),k=read();
s=read(),t=read();
for(int i=1;i<=p;i++)
{
int a,b,l;
a=read(),b=read(),l=read();
add(a,b,l);
add(b,a,l);
for(int j=1;j<=k;++j)
{
add(a+j*n,b+j*n,l);
add(b+j*n,a+j*n,l);
add(a+(j-1)*n,b+j*n,0);
add(b+(j-1)*n,a+j*n,0);
}
}
dijkstra();
int ans=0x3f3f3f3f;
for(int i=0;i<=k;i++)
ans=min(ans,dis[i*n+t]);
cout<<ans<<endl;
return 0;
}