#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
struct edge
{
int v,w;
};
struct node
{
int val,id;
friend bool operator<(node x,node y)
{
return x.val>y.val;
}
};
int n,m,k;
int s,t;
vector<edge> e[500010];
int dis[500010],cnt[500010];
int ans=1e9;
void dijkstra(int s)
{
memset(dis,0x3f,sizeof(dis));
priority_queue<node> q;
bool vis[500010];
bool vis2[500010];
q.push(node{0,s});
while(!q.empty())
{
auto tmp=q.top();
q.pop();
int mini=tmp.id;
int jl=tmp.val;
if(vis[mini])
{
continue;
}
vis[mini]=true;
for(int i=0;i<e[mini].size();i++)
{
if(dis[e[mini][i].v]>e[mini][i].w+jl)
{
dis[e[mini][i].v]=e[mini][i].w+jl;
q.push(node{dis[e[mini][i].v],e[mini][i].v});
}
}
}
}
int main()
{
cin>>n>>m>>k>>s>>t;
s++;
t++;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
a++;
b++;
e[a].push_back({b,c});
e[b].push_back({a,c});
for(int j=1;j<=k;j++)
{
e[a+(j-1)*n].push_back({b+j*n,0});
e[a+j*n].push_back({b+j*n,c});
e[b+j*n].push_back({a+j*n,c});
}
}
dijkstra(s);
for(int i=0;i<=k;i++)
{
ans=min(ans,dis[t+i*n]);
}
cout<<ans;
return 0;
}