#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);
}
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]]);
}
}
int dfs(int nod)
{
if(!h[nod])
return dfs(str[0][nod]) + 1;
return h[nod];
}
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]];
for(; pas>=0; --pas)
if(h[str[pas][x]] >= h[y])
{
m = minim(m, mini[pas][x]);
x = str[pas][x];
}
if(x == y)
return m;
for(pas = lg[h[y]]; 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(mini[0][x], mini[0][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);
str[0][i] = x;
mini[0][i] = y;
}
scanf("%d%d%d%d%d%d", &X, &Y, &A, &B, &C, &D);
h[1] = 1;
for(i=2; i<=n; ++i)
h[i] = dfs(i);
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;
}