#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define pa pair<int,int>
#define inf 0x7fffffff
#define M 400008
using namespace std;
int d[M],f[M],n,m,k,s,t,cnt,head[M],next[*M],u[*M],v[*M];
void jia(int a1,int a2,int a3)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
v[cnt]=a3;
return;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&t);
for(int i=;i<=m;i++)
{
int a1,a2,a3;
scanf("%d%d%d",&a1,&a2,&a3);
jia(a1,a2,a3);
jia(a2,a1,a3);
for(int j=;j<=k;j++)
{
jia(j*n+a1,j*n+a2,a3);
jia(j*n+a2,j*n+a1,a3);
jia((j-)*n+a1,j*n+a2,);
jia((j-)*n+a2,j*n+a1,);
}
}
priority_queue<pa,vector<pa>,greater<pa> >q;
memset(d,,sizeof(d));
q.push(make_pair(,s));
d[s]=;
for(;!q.empty();)
{
int now=q.top().second;
q.pop();
if(f[now])
continue;
f[now]=;
for(int i=head[now];i;i=next[i])
if(d[u[i]]>d[now]+v[i])
{
d[u[i]]=d[now]+v[i];
q.push(make_pair(d[u[i]],u[i]));
}
}
int ans=inf;
for(int i=;i<=k;i++)
ans=min(ans,d[i*n+t]);
printf("%d\n",ans);
return ;
}
分层图按k分层