#include <bits/stdc++.h>
#define MAXN 2100010
#define INF 2147483647
using namespace std;
int n,m,k,p,q,b,dis[MAXN];
bool vis[MAXN];
struct edge{
int v,w;
};
vector <edge> G[MAXN];
struct node{
int dis,pos;
bool operator <(const node &x) const
{
return x.dis<dis;
}
};
priority_queue <node> Q;
inline void Dijkstra()
{
for(int i=0;i<=MAXN;i++)
dis[i]=INF;
dis[1]=0;
Q.push((node){0,1});
while(!Q.empty())
{
node tmp=Q.top();
Q.pop();
int x=tmp.pos;
int d=tmp.dis;
if(vis[x]==true)
continue;
vis[x]=true;
for(int i=0;i<G[x].size();i++)
{
int k=G[x][i].v;
if(dis[k]>dis[x]+G[x][i].w)
{
dis[k]=dis[x]+G[x][i].w;
if(vis[k]==true)
Q.push((node){dis[k],k});
}
}
}
}
inline void add(int u,int v,int w)
{
G[u].push_back((edge){v,w});
}
inline void add_work()
{
for(int i=1;i<=m;i++)
{
int u,v,w;
cin >> u >> v >> w;
add(u,v,w);
add(v,u,w);
for(int j=1;j<=k;j++)
{
int d=floor(p*w/q)+b;
add(u+(j-1)*n,v+j*n,d);
add(v+(j-1)*n,u+j*n,d);
add(u+j*n,v+j*n,w);
add(v+j*n,u+j*n,w);
}
}
Dijkstra();
}
int main()
{
cin >> n >> m >> k >> p >> q >> b;
add_work();
int ans=INF;
for(int i=n;i<=n*(k+1);i+=n)
ans=min(ans,dis[i]);
cout << ans << endl;
return 0;
}