# include <fstream>
# include <iostream>
# include <cstdio>
# include <vector>
# include <algorithm>
# define DIM 32003
# define pb push_back
# define min(a,b) a<b?a:b
using namespace std;
struct nod {
int i, c;
nod(){}
nod(int I, int C){
i=I;c=C;}
};
int n, m, p, A, B, C, D, X, Y, Z, t[20][DIM], b[20][DIM], gr[DIM];
vector<nod>G[DIM];
void read ()
{
ifstream fin ("atac.in");
fin>>n>>m>>p;
int u, v;
for(int i=1;i<n;++i)
{
t[0][i+1]=-1;
fin>>u>>v;
G[u].pb(nod(i+1, v));
G[i+1].pb(nod(u, v));
}
fin>>X>>Y>>A>>B>>C>>D;
}
void DF (int k)
{
for(vector<nod>::iterator I=G[k].begin();I<G[k].end();++I)
if (t[0][I->i]==-1)
{
gr[I->i]=gr[k]+1;
t[0][I->i]=k;
b[0][I->i]=I->c;
DF(I->i);
}
}
void comp ()
{
DF(1);
int cont=1;
for(int i=1;cont;++i)
{
cont=0;
for(int j=1;j<=n;++j)
if (t[i-1][t[i-1][j]])
{
cont=1;
t[i][j]=t[i-1][t[i-1][j]];
b[i][j]=min(b[i-1][j],b[i-1][t[i-1][j]]);
}
}
}
int bmb ()
{
int x, y, sol=10*DIM, mij=0, st, dr, cont, i;
if (gr[X]<gr[Y])x=X, y=Y;
else x=Y, y=X;
while (gr[x]!=gr[y])
{
if (t[0][y] && gr[t[0][y]]==gr[x])
sol=min(sol,b[0][y]), y=t[0][y];
else
{
for(i=0;gr[t[i][y]]>gr[x];++i);
sol=min(sol,b[i-1][y]);
y=t[i-1][y];
/* cont=1;
for(st=0, dr=15, mij=(st+dr)/2;cont;mij=(st+dr)/2)
if (st==dr)cont=0;
else if (gr[t[mij][y]]>gr[x])st=mij+1;
else dr=mij;
sol=min(sol,b[mij][y]);
y=t[mij][y];*/
}
}
cont=1;
if (x==y)cont=0;
while (cont)
{
if (t[0][x]==t[0][y])
sol=min(sol,(min(b[0][x],b[0][y]))), cont=0;
else
{
for(i=0;t[i][x]!=t[i][y];++i);
sol=min(sol,(min(b[i-1][x],b[i-1][y])));
x=t[i-1][x];
y=t[i-1][y];
/* cont=1;
for(st=0, dr=15, mij=(st+dr)/2;cont;mij=(st+dr)/2)
if (st==dr)cont=0;
else if (t[mij][y]==t[mij][x])dr=mij;
else st=mij+1;
sol=min(sol,(min(b[mij][x],b[mij][y])));
x=t[mij][x];
y=t[mij][y];*/
}
}
return sol;
}
void solve ()
{
freopen("atac.out", "w", stdout);
for(int i=1;i<=m;++i)
{
Z=bmb();
X=(X*A+Y*B)%n+1;
Y=(Y*C+Z*D)%n+1;
if (i>=m-p+1)
{
if (X!=Y)printf("%d\n", Z);
else printf("0\n");
}
}
}
int main ()
{
read ();
comp ();
solve ();
return 0;
}