#include <cstdio>
#include <algorithm>
#define MAXN 32000
#define LOG 16
#define INF 0x3f3f3f3f
int r, n, m, p, lg[MAXN+1], str[LOG][MAXN+1], mini[LOG][MAXN+1], lista[MAXN+1], val[MAXN+1], nxt[MAXN+1], cost[MAXN+1], d[MAXN+1], h[MAXN+1];
bool viz[MAXN+1];
inline int minim(int a, int b){
return (a < b ? a : b);
}
inline void adauga(int x, int y, int z)
{
val[++r] = y;
nxt[r] = lista[x];
cost[r] = z;
lista[x] = r;
}
void dfs(int nod)
{
int p;
viz[nod] = 1;
p = lista[nod];
while(p)
{
if(!viz[val[p]])
{
d[val[p]] = cost[p];
str[0][val[p]] = nod;
mini[0][val[p]] = minim(d[val[p]], d[nod]);
h[val[p]] = h[nod] + 1;
dfs(val[p]);
}
p = nxt[p];
}
}
void stramosi()
{
int i, log;
for(log=1; (1<<log)<=n; ++log)
for(i=1; i<=n; ++i){
str[log][i] = str[log-1][str[log-1][i]];
mini[log][i] = minim(mini[log-1][i], mini[log-1][str[log-1][i]]);
}
}
inline int query(int x, int y)
{
if(x == y)
return 0;
int m = INF, pas;
if(h[x] < h[y])
std::swap(x, y);
pas = lg[h[x]-h[y]];
if(h[x] != h[y]){
for(; pas>=0; --pas)
if(h[str[pas][x]] > h[y])
{
m = minim(m, mini[pas][x]);
x = str[pas][x];
}
if(str[0][x] == y)
return m;
else
{
m = minim(m, mini[0][x]);
x = str[0][x];
}
}
for(pas = lg[n]; pas>=0; --pas)
if(str[pas][x] != str[pas][y])
{
m = minim(m, minim(mini[pas][x], mini[pas][y]));
x = str[pas][x];
y = str[pas][y];
}
m = minim(m, minim(d[x], d[y]));
return m;
}
int main()
{
freopen("atac.in", "r", stdin);
freopen("atac.out", "w", stdout);
int i, x, y, X, Y, A, B, C, D, Z;
scanf("%d%d%d", &n, &m, &p);
lg[2] = 1;
for(i=3; i<=n; ++i)
lg[i] = lg[i/2] + 1;
for(i=2; i<=n; ++i)
{
scanf("%d%d", &x, &y);
adauga(i, x, y);
adauga(x, i, y);
}
scanf("%d%d%d%d%d%d", &X, &Y, &A, &B, &C, &D);
h[1] = 1;
dfs(1);
stramosi();
for(i=1; i<=m; ++i)
{
Z = query(X, Y);
if(i >= m-p+1)
printf("%d\n", Z);
X = (X*A + Y*B) % n + 1;
Y = (Y*C + Z*D) % n + 1;
}
return 0;
}