#include <fstream>
using namespace std;
ifstream f("atac.in");
ofstream g("atac.out");
#define nmax 32001
//#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[2*nmax],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;};
struct aint{ int x,i;aint *st,*dr; };
arbore *Ar[nmax];
aint *I;
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(aint *&arb,int x,int y)
{
aint *a=new aint;
a->st=a->dr=NULL;
if(x==y)
{
a->x=lv[x];
a->i=x;
arb=a;
}
else
{
int mij=(x+y)/2;
intervale(a->st,x,mij);
intervale(a->dr,mij+1,y);
a->x=min(a->st->x,a->dr->x);
if(a->x==a->st->x)
a->i=a->st->i;
else
a->i=a->dr->i;
arb=a;
}
}
void query1(aint *ar,int c1,int c2,int x,int y)
{
if(c1>=x&&c2<=y)
{
if(niv>ar->x)
{
niv=ar->x;
lca=ar->i;
}
return;
}
int mij=(c1+c2)/2;
if(x<=mij)
query1(ar->st,c1,mij,x,y);
if(mij<y)
query1(ar->dr,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(I,1,l);
int i;
for(i=1;i<=m;i++)
{
niv=nmax;
query1(I,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;
}