using namespace std;
#include <cstdio>
#include <algorithm>
#include <vector>
#define IN "atac.in"
#define OUT "atac.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<15
#define M_MAX 1<<15
typedef struct nod
{
int x, c;
nod *a;
} *pNod;
pNod v[32005];
int hg[N_MAX];
int CS[N_MAX],tata[N_MAX];
int q,rez,s,f;
int maxhg,Z,X,Y,A,B,C,D,P,N,M;
bool viz[N_MAX];
void add(int x, int y, int c)
{
pNod p;
p = new nod;
p -> x = y;
p -> c = c;
p -> a = v[x];
v[x] = p;
}
void scan()
{
int x,y;
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d%d%d\n", &N,&M,&P);
FOR(i,1,N-1)
{
scanf("%d%d\n", &x,&y);
add(i+1,x,y);
add(x,i+1,y);
}
scanf("%d%d%d%d%d%d",&X,&Y,&A,&B,&C,&D);
}
void DF(int nod, int niv)
{
viz[nod] = 1;
pNod p;
hg[nod] = niv;
for (p = v[nod]; p != NULL; p = p -> a)
if( !viz[p -> x] )
{
tata[p -> x] = nod;
CS[p -> x] = p -> c;
DF(p -> x, niv + 1);
}
}
int find(int x, int y)
{
int minim = 1<<30;
if( hg[x] > hg[y])
while( hg[x] != hg[y])
{
minim = min(minim,CS[x]);
x = tata[x];
}
else
if (hg[x] < hg[y])
while (hg[x] != hg[y])
{
minim = min(minim,CS[y]);
y = tata[y];
}
while (x != y)
{
minim = min(minim,CS[x]);
minim = min(minim,CS[y]);
x = tata[x]; y = tata[y];
}
return minim;
}
void solve()
{
FOR(i,1,M)
{
rez = 1<<30;
rez = find(X,Y);
if(X == Y)
rez=0;
if(i > M-P)
printf("%d\n", rez);
Z = rez;
X = (X*A + Y*B) % N + 1;
Y = (Y*C + Z*D) % N + 1;
}
}
int main()
{
scan();
DF(1,1);
solve();
return 0;
}