#include<stdio.h>
struct nod{
long v;
long b;
nod *next;
};
nod *vec[32001];
long n,m,p,j,k,i,niv[32001],dad[32001][17],bom[32001][17],
aa,bb,cc,dd,xx,yy,zz;
void pune();
void df(long ii, long nn);
void stramosi();
void atac();
long dady(long oo,long nn);
long bomm(long oo,long nn);
int main()
{ freopen("atac.in","rt",stdin);
freopen("atac.out","wt",stdout);
scanf("%ld%ld%ld",&n,&m,&p);
for(i=2;i<=n;i++)
{ scanf("%ld%ld",&j,&k);
pune();
}
niv[1]=1;
df(1,1);
stramosi();
scanf("%ld%ld%ld%ld%ld%ld",&xx,&yy,&aa,&bb,&cc,&dd);
for(;m>p;m--)
{ atac();
xx=(xx*aa+yy*bb)%n+1;
yy=(yy*cc+zz*dd)%n+1;
}
for(;m;m--)
{ atac();
printf("%ld\n",zz);
xx=(xx*aa+yy*bb)%n+1;
yy=(yy*cc+zz*dd)%n+1;
}
return 0;
}
void pune()
{ nod *paux;
paux=new nod;
paux->v=j;
paux->b=k;
paux->next=(vec[i])?vec[i]:0;
vec[i]=paux;
paux=new nod;
paux->v=i;
paux->b=k;
paux->next=(vec[j])?vec[j]:0;
vec[j]=paux;
}
void df(long ii, long nn)
{ nod *paux;
for(paux=vec[ii];paux;paux=paux->next)
if(!niv[paux->v])
{ niv[paux->v]=nn+1;
dad[paux->v][0]=ii;
bom[paux->v][0]=paux->b;
df(paux->v,nn+1);
}
}
void stramosi()
{ long lc,lnc,coada[32001],b1,b2,t1,t2;
lc=n-1;
for(i=1;i<=lc;i++) coada[i]=i+1;
lnc=0;
for(i=1;lc;i++)
{ for(j=1;j<=lc;j++)
{ k=coada[j];
t1=dad[k][i-1]; t2=dad[t1][i-1];
if(t2)
{ dad[k][i]=t2;
coada[++lnc]=k;
b1=bom[k][i-1];
b2=bom[t1][i-1];
bom[k][i]=(b1<b2)?b1:b2;
}
}
lc=lnc;
lnc=0;
}
}
long dady(long oo,long nn)
{ long oc=oo;
for(j=16;j>=0;j--)
if((niv[oo]-nn)&(1<<j))oc=dad[oc][j];
return oc;
}
long bomm(long oo,long nn)
{
long oc=oo,bomb=100001;
for(j=16;j>=0;j--)
{ if((niv[oo]-nn)&(1<<j))
{ bomb=(bomb<bom[oc][j])?bomb:bom[oc][j];
oc=dad[oc][j];
}
}
return bomb;
}
void atac()
{ long st,dr,mi,nt,d1,d2,b1,b2;
if(xx==yy) {zz=0;return;}
st=1;dr=(niv[xx]<niv[yy])?niv[xx]:niv[yy];
if(dady(xx,dr)==dady(yy,dr))nt=dr;
else
{ while(dr-st>1)
{ mi=(st+dr)>>1;
d1=dady(xx,mi);
d2=dady(yy,mi);
if(d1==d2)st=mi;
else dr=mi;
}
nt=st;
}
b1=bomm(xx,nt);b2=bomm(yy,nt);
zz=(b1<b2)?b1:b2;
}