#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls p<<1
#define rs p<<1|1
#define pb push_back
const ll N=2e6+10;
const ll M=2e3+10;
const ll inf=1e18;
const ll mod=1e9+7;
inline ll lowbit(ll x){
return x&(-x);
}
ll n,m,k;
ll s,t;
struct edge{
ll v,w;
};
vector<edge> g[N];
ll dis[N];
struct node{
ll d,x;
};
bool operator<(const node&a,const node&b){
return a.d>b.d;
}
priority_queue<node> q;
ll vis[N];
inline void dij(){
memset(dis,0x7f,sizeof dis);
//for(int i=0;i<=k;i++) dis[s+i*n]=0;
dis[s]=0;
q.push({0,s});
while(!q.empty()){
node x=q.top();
q.pop();
if(vis[x.x]) continue;
vis[x.x]=1;
for(auto y:g[x.x]){
if(dis[y.v]>dis[x.x]+y.w){
dis[y.v]=dis[x.x]+y.w;
q.push({dis[y.v],y.v});
}
}
}
}
ll ans=inf;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
cin>>s>>t;
s++;
t++;
for(int i=1;i<=m;i++){
ll a,b,c;
cin>>a>>b>>c;
a++;
b++;
for(int j=1;j<=k;j++){
g[a+(k-1)*n].pb({b+k*n,0});
g[b+(k-1)*n].pb({a+k*n,0});
g[a+k*n].pb({b+k*n,c});
g[b+k*n].pb({a+k*n,c});
}
g[a].pb({b,c});
g[b].pb({a,c});
}
dij();
for(int i=0;i<=k;i++) ans=min(ans,dis[t+n*i]);
cout<<ans<<"\n";
return 0;
}
别忘了@我