#include <fstream>
using namespace std;
ifstream f("atac.in");
ofstream g("atac.out");
#define nmax 35001
//#define eu (eu-1)
#define min(a,b) ((a<b)?(a):(b))
#define max(a,b) ((a>b)?(a):(b))
bool viz[nmax],viz2[nmax];
int eu[1000000],n,m,p,l,Cs[nmax];
int poz[nmax],tata[nmax];
int lv[nmax],lca,niv;
int X,Y,A,B,C,D,Z;
struct arbore { int c,x;arbore *urm;};
arbore *Ar[nmax];
struct{int x,i;} I[1<<16];
void add(arbore *&a,int x,int c)
{
arbore *ar=new arbore;
ar->x=x;
ar->c=c;
ar->urm=a;
a=ar;
}
void read()
{
f>>n>>m>>p;
int i,u,v;
for(i=2;i<=n;++i)
{
f>>u>>v;
add(Ar[u],i,v);
add(Ar[i],u,v);
}
f>>X>>Y>>A>>B>>C>>D;
}
int cost(int nod1,int nod2)
{
for(arbore *p=Ar[nod1];p!=NULL;p=p->urm)
{
if(p->x==nod2)
return p->c;
}
return 0;
}
void dfs(int t,int nod,int level)
{
eu[++l]=nod;
tata[nod]=t;
Cs[nod]=cost(nod,t);
lv[l]=level;
if(!viz2[nod])
{
viz2[nod]=true;
poz[nod]=l;
}
viz[nod]=true;
for(arbore *a=Ar[nod];a!=NULL;a=a->urm)
{
if(!viz[a->x])
{
dfs(nod,a->x,level+1);
eu[++l]=nod;
lv[l]=level;
}
}
}
void intervale(int i,int x,int y)
{
if(x==y)
{
I[i].x=lv[x];
I[i].i=x;
}
else
{
int mij=(x+y)/2;
intervale(2*i,x,mij);
intervale(2*i+1,mij+1,y);
I[i].x=min(I[2*i].x,I[2*i+1].x);
if(I[i].x==I[2*i].x)
I[i].i=I[2*i].i;
else
I[i].i=I[2*i+1].i;
}
}
void query1(int i,int c1,int c2,int x,int y)
{
if(c1>=x&&c2<=y)
{
if(niv>I[i].x)
{
niv=I[i].x;
lca=I[i].i;
}
return;
}
int mij=(c1+c2)/2;
if(x<=mij)
query1(2*i,c1,mij,x,y);
if(mij<y)
query1(2*i+1,mij+1,c2,x,y);
}
void findz()
{
int zmin=nmax,i;
for(i=X;i!=lca;i=tata[i])
if(zmin>Cs[i]) zmin=Cs[i];
for(i=Y;i!=lca;i=tata[i])
if(zmin>Cs[i]) zmin=Cs[i];
Z=zmin;
}
void solve()
{
intervale(1,1,l);
int i;
for(i=1;i<=m;i++)
{
niv=nmax;
query1(1,1,l,min(poz[X],poz[Y]),max(poz[X],poz[Y]));
lca=eu[lca];
findz();
X=(X*A+Y*B)%n+1;
Y=(Y*C+Z*D)%n+1;
if(i>m-p)
g<<Z<<endl;
}
}
int main()
{
read();
dfs(0,1,1);
solve();
return 0;
}