//300th task
#include <bits/stdc++.h>
#define maxN 32005
#define maxLog 15
#define INF (1<<30)
using namespace std;
vector<pair<int,int> >v[maxN];
int anc[maxLog][maxN],bst[maxLog][maxN];
int n,m,p,i,j,x,y,a,b,c,d,lvl[maxN];
void dfs(int nod,int tata)
{
lvl[nod]=lvl[tata]+1;
vector<pair<int,int> >::iterator it;
for(it=v[nod].begin();it!=v[nod].end();it++)
if(it->first!=tata)
{
anc[0][it->first]=nod;
bst[0][it->first]=it->second;
dfs(it->first,nod);
}
}
int query(int x,int y)
{
int sol=INF,len,i;
if(lvl[x]<lvl[y])
swap(x,y);
len=lvl[x]-lvl[y];
for(i=0;i<maxLog;i++)
if(len&(1<<i))
sol=min(sol,bst[i][x]),
x=anc[i][x];
for(i=maxLog-1;i>=0;i--)
if(anc[i][x]!=anc[i][y])
sol=min(sol,min(bst[i][x],bst[i][y])),
x=anc[i][x],
y=anc[i][y];
if(x!=y)
sol=min(sol,min(bst[0][x],bst[0][y]));
if(sol==INF)
return 0;
return sol;
}
int main()
{
freopen("atac.in","r",stdin);
freopen("atac.out","w",stdout);
scanf("%d %d %d",&n,&m,&p);
for(i=2;i<=n;i++)
scanf("%d %d",&x,&y),
v[x].push_back(make_pair(i,y)),
v[i].push_back(make_pair(x,y));
scanf("%d %d %d %d %d %d",&x,&y,&a,&b,&c,&d);
dfs(1,0);
for(i=1;i<maxLog;i++)
for(j=1;j<=n;j++)
bst[i][j]=INF;
for(i=1;i<maxLog;i++)
for(j=1;j<=n;j++)
anc[i][j]=anc[i-1][anc[i-1][j]],
bst[i][j]=min(bst[i-1][j],bst[i-1][anc[i-1][j]]);
for(int test=1;test<=m;test++)
{
int val=query(x,y);
if(test>m-p)
printf("%d\n",val);
x=(x*a+y*b)%n+1;
y=(y*c+val*d)%n+1;
}
return 0;
}