#include <bits/stdc++.h>
using namespace std;
int n,m,p,aux1,aux2,n1,n2,nr1,nr2,ans,lca,euler[75003],indexx[32003],kontor,indi[32003],poz[32003],l[75003],rmq[25][75005],str[25][32005],dist[32003],d[25][32005];vector < pair <int,int> > arb[1003];
queue <int> chestie;
void dfs (int nod) {
indexx[nod]=++kontor;euler[++euler[0]]=indexx[nod];indi[indexx[nod]]=nod;poz[indexx[nod]]=euler[0];
for(int i=0;i<(int)arb[nod].size();++i)
if(indexx[arb[nod][i].first]==0) {
dfs(arb[nod][i].first);
euler[++euler[0]]=indexx[nod];
}
}
void build_rmq () {
rmq[0][1]=euler[1];
for(int i=2;i<=euler[0];++i)
rmq[0][i]=euler[i],l[i]=l[(i>>1)]+1;
for(int k=1;k<=l[euler[0]];++k)
for(int i=1;i+(1<<k)-1<=euler[0];++i)
rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]);
}
int querrys (int p1, int p2) {
if(p1>p2) swap(p1,p2);
return min(rmq[l[p2-p1+1]][p1],rmq[l[p2-p1+1]][p2-(1<<l[p2-p1+1])]);
}
void bfs () {
int nod;
str[0][chestie.front()]=chestie.front();dist[chestie.front()]=1;
while(!chestie.empty()) {
nod=chestie.front();
for(int i=0;i<(int)arb[nod].size();++i)
if(dist[arb[nod][i].first]==0) {
dist[arb[nod][i].first]=dist[nod]+1;
chestie.push(arb[nod][i].first);str[0][arb[nod][i].first]=nod;d[0][arb[nod][i].first]=arb[nod][i].second;
}
chestie.pop();
}
}
void build_str () {
d[0][1]=(1<<30);
for(int k=1;(1<<k)-1<=n;++k)
for(int i=1;i<=n;++i)
//if(dist[i]-(1<<k)+1>0)
str[k][i]=str[k-1][str[k-1][i]],d[k][i]=min(d[k-1][i],d[k-1][str[k-1][i]]);
}
int quer (int nod1, int nod2) {
aux1=indexx[nod1];aux2=indexx[nod2];lca=indi[querrys(poz[aux1],poz[aux2])];
nr1=dist[nod1]-dist[lca];nr2=dist[nod2]-dist[lca];ans=1e9;n1=nod1;n2=nod2;
for(int i=0;nr1>0;++i)
if((nr1 & (1<<i))!=0) {
nr1^=(1<<i);
ans=min(ans,d[i][n1]);n1=str[i][n1];
}
for(int i=0;nr2>0;++i)
if((nr2 & (1<<i))!=0) {
nr2^=(1<<i);
ans=min(ans,d[i][n2]);n2=str[i][n2];
}
return ans;
}
int main () {
int nr1,nr2,a,b,c,d,x,y,z;
freopen("atac.in","r",stdin);
freopen("atac.out","w",stdout);
scanf("%d%d%d", &n, &m, &p);++m;++m;
for(int i=2;i<=n;++i) {
scanf("%d%d", &nr1, &nr2);
arb[i].push_back(make_pair(nr1,nr2));arb[nr1].push_back(make_pair(i,nr2));
}
//alegem radacina nodul 1;
dfs(1);build_rmq();chestie.push(1);bfs();build_str();
//for(int i=1;i<=n;++i)
//printf("%d %d\n", indexx[i], indi[indexx[i]]);
//for(int i=1;i<=n;++i)
//printf("%d ", dist[i]);
//for(int i=0;(1<<i)-1<=n;++i,printf("\n"))
//for(int j=1;j<=n;++j)
//printf("%d ", str[i][j]);
//return 0;
scanf("%d%d%d%d%d%d", &x, &y, &a, &b, &c, &d);
while(--m) {
z=0;
if(x!=y)
z=quer(x,y);
if(m<=p)
printf("%d\n", z);
x=(x*a+y*b)%(n+1);y=(y*c+z*d)%(n+1);
}
return 0;
}