#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
struct Edge {
ll to, cost;
Edge(ll t, ll c) : to(t), cost(c) {}
};
struct Elem {
ll dist, speed, cur;
Elem(ll a, ll b, ll c) : dist(a), speed(b), cur(c) {}
};
bool operator>(const Elem& a, const Elem& b) {
return a.dist != b.dist ? a.dist > b.dist : a.speed > b.speed;
}
typedef vector< vector<Edge> > Graph;
ll const INF = 1LL << 60;
int main() {
ll dist[510][60][2];
ll ans = INF;
for(int i=0; i<510; i++)
for(int j=0; j<60; j++)
for(int k=0; k<2; k++)
dist[i][j][k] = INF;
int n, m; cin >> n >> m;
Graph G(n);
for(int i=0; i<m; i++) {
ll a, b, t; cin >> a >> b >> t;
a--; b--;
G[a].push_back(Edge(b,t));
G[b].push_back(Edge(a,t));
}
ll v, a, b, c;
cin >> v >> a >> b >> c;
priority_queue< Elem, vector<Elem>, greater<Elem> > q;
ll cur = 0, speed = v;
dist[0][v][0] = 0;
q.push(Elem(0, speed, cur));
while(!q.empty()) {
Elem temp = q.top(); q.pop();
cur = temp.cur, speed = temp.speed;
ll nsp = (a * speed + b) % c;
for(size_t i=0; i<G[cur].size(); i++) {
Edge e = G[cur][i];
ll d1 = dist[cur][speed][0] + e.cost * speed;
ll d2 = dist[cur][speed][1] + e.cost * speed;
// home to university
if(dist[e.to][nsp][0] > d1) {
dist[e.to][nsp][0] = d1;
if(e.to == n-1) dist[e.to][nsp][1] = dist[e.to][nsp][0];
q.push(Elem(d1, nsp, e.to));
}
// university to home
if(dist[e.to][nsp][1] > d2) {
dist[e.to][nsp][1] = d2;
q.push(Elem(d2, nsp, e.to));
}
}
}
for(int i=0; i<c; i++) ans = min(ans, dist[0][i][1]);
cout << ans << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGludCBsbDsKCnN0cnVjdCBFZGdlIHsKICAgIGxsIHRvLCBjb3N0OwogICAgRWRnZShsbCB0LCBsbCBjKSA6IHRvKHQpLCBjb3N0KGMpIHt9Cn07CnN0cnVjdCBFbGVtIHsKICAgIGxsIGRpc3QsIHNwZWVkLCBjdXI7CiAgICBFbGVtKGxsIGEsIGxsIGIsIGxsIGMpIDogZGlzdChhKSwgc3BlZWQoYiksIGN1cihjKSB7fQp9Owpib29sIG9wZXJhdG9yPihjb25zdCBFbGVtJiBhLCBjb25zdCBFbGVtJiBiKSB7CiAgICByZXR1cm4gYS5kaXN0ICE9IGIuZGlzdCA/IGEuZGlzdCA+IGIuZGlzdCA6IGEuc3BlZWQgPiBiLnNwZWVkOwp9Cgp0eXBlZGVmIHZlY3RvcjwgdmVjdG9yPEVkZ2U+ID4gR3JhcGg7CmxsIGNvbnN0IElORiA9IDFMTCA8PCA2MDsKCmludCBtYWluKCkgewogICAgbGwgZGlzdFs1MTBdWzYwXVsyXTsKICAgIGxsIGFucyA9IElORjsKICAgIGZvcihpbnQgaT0wOyBpPDUxMDsgaSsrKQogICAgICAgIGZvcihpbnQgaj0wOyBqPDYwOyBqKyspCiAgICAgICAgICAgIGZvcihpbnQgaz0wOyBrPDI7IGsrKykKICAgICAgICAgICAgICAgIGRpc3RbaV1bal1ba10gPSBJTkY7CgogICAgaW50IG4sIG07IGNpbiA+PiBuID4+IG07CiAgICBHcmFwaCBHKG4pOwogICAgZm9yKGludCBpPTA7IGk8bTsgaSsrKSB7CiAgICAgICAgbGwgYSwgYiwgdDsgY2luID4+IGEgPj4gYiA+PiB0OwogICAgICAgIGEtLTsgYi0tOwogICAgICAgIEdbYV0ucHVzaF9iYWNrKEVkZ2UoYix0KSk7CiAgICAgICAgR1tiXS5wdXNoX2JhY2soRWRnZShhLHQpKTsKICAgIH0KICAgIGxsIHYsIGEsIGIsIGM7CiAgICBjaW4gPj4gdiA+PiBhID4+IGIgPj4gYzsKICAgIHByaW9yaXR5X3F1ZXVlPCBFbGVtLCB2ZWN0b3I8RWxlbT4sIGdyZWF0ZXI8RWxlbT4gPiBxOwoKICAgIGxsIGN1ciA9IDAsIHNwZWVkID0gdjsKICAgIGRpc3RbMF1bdl1bMF0gPSAwOwogICAgcS5wdXNoKEVsZW0oMCwgc3BlZWQsIGN1cikpOwogICAgd2hpbGUoIXEuZW1wdHkoKSkgewogICAgICAgIEVsZW0gdGVtcCA9IHEudG9wKCk7IHEucG9wKCk7CiAgICAgICAgY3VyID0gdGVtcC5jdXIsIHNwZWVkID0gdGVtcC5zcGVlZDsKICAgICAgICBsbCBuc3AgPSAoYSAqIHNwZWVkICsgYikgJSBjOwogICAgICAgIGZvcihzaXplX3QgaT0wOyBpPEdbY3VyXS5zaXplKCk7IGkrKykgewogICAgICAgICAgICBFZGdlIGUgPSBHW2N1cl1baV07CiAgICAgICAgICAgIGxsIGQxID0gZGlzdFtjdXJdW3NwZWVkXVswXSArIGUuY29zdCAqIHNwZWVkOwogICAgICAgICAgICBsbCBkMiA9IGRpc3RbY3VyXVtzcGVlZF1bMV0gKyBlLmNvc3QgKiBzcGVlZDsKICAgICAgICAgICAgLy8gaG9tZSB0byB1bml2ZXJzaXR5CiAgICAgICAgICAgIGlmKGRpc3RbZS50b11bbnNwXVswXSA+IGQxKSB7CiAgICAgICAgICAgICAgICBkaXN0W2UudG9dW25zcF1bMF0gPSBkMTsKICAgICAgICAgICAgICAgIGlmKGUudG8gPT0gbi0xKSBkaXN0W2UudG9dW25zcF1bMV0gPSBkaXN0W2UudG9dW25zcF1bMF07CiAgICAgICAgICAgICAgICBxLnB1c2goRWxlbShkMSwgbnNwLCBlLnRvKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdW5pdmVyc2l0eSB0byBob21lCiAgICAgICAgICAgIGlmKGRpc3RbZS50b11bbnNwXVsxXSA+IGQyKSB7CiAgICAgICAgICAgICAgICBkaXN0W2UudG9dW25zcF1bMV0gPSBkMjsKICAgICAgICAgICAgICAgIHEucHVzaChFbGVtKGQyLCBuc3AsIGUudG8pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IoaW50IGk9MDsgaTxjOyBpKyspIGFucyA9IG1pbihhbnMsIGRpc3RbMF1baV1bMV0pOwogICAgY291dCA8PCBhbnMgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9