#include <cstdio>
#define fin "atac.in"
#define fout "atac.out"
#define DBGx
const int Nmax = 32011;
int N,M,P,str[Nmax][22],minc[Nmax][22];
int tat[Nmax],cost[Nmax],adc[Nmax];
int X,Y,Z,A,B,C,D;
int min(int a,int b) { ( a < b ) ? (a) : (a=b); return a; };
int swap(int &a,int &b)
{
int aux;
aux=a; a=b; b=aux;
}
int df(int x)
{
if ( adc[x] )
return adc[x];
adc[x]=1+df(tat[x]);
return adc[x];
}
int query(int x,int y)
{
int k,ret;
if ( adc[x] == adc[y] )
{
ret=1000100;
if ( x == y ) return ret;
for ( k = 0 ; k < 22 && str[x][k] != str[y][k]; ++k )
{
ret = min(ret,minc[x][k]);
ret = min(ret,minc[y][k]);
}
--k;
if ( k < 0 )
{
++k;
ret = min(ret,minc[x][k]);
ret = min(ret,minc[y][k]);
}
return min(ret,query(str[x][k],str[y][k]));
}
if ( adc[x] < adc[y] )
swap(x,y);
for ( k=0 ; adc[y] + ( 1 << k ) <= adc[x] ; ++k );
--k;
return min(minc[x][k],query(str[x][k],y));
}
void solve()
{
int i,j;
adc[1]=1; //radacina
for (i=1;i<=N;++i)
df(i);
#ifdef DBG
for (i=1;i<=N;++i)
printf("%d ",adc[i]);
printf("\n\n");
#endif
for (i=1;i<=N;++i)
{
minc[i][0]=cost[i];
str[i][0]=tat[i];
}
//aflu stramosii
for (j=1;j<22;++j)
for (i=1;i<=N;++i)
if ( adc[i] > ( 1 << j ) )
str[i][j] = str[ str[i][j-1] ][ j - 1 ];
#ifdef DBG
for (i=1;i<=N;++i)
{
for (j=0;j<=4;++j)
printf("%d ",str[i][j]);
printf("\n");
}
printf("\n");
#endif
//aflu drumul minim dintre un nod x si stramosii lui pe put de 2
for (j=1;j<22;++j)
for (i=1;i<=N;++i)
if ( adc[i] > ( 1 << j ) )
minc[i][j] = min(minc[i][j-1],minc[ str[i][j-1] ][ j - 1 ]);
#ifdef DBG
for (i=1;i<=N;++i)
{
for (j=0;j<=4;++j)
printf("%d ",minc[i][j]);
printf("\n");
}
printf("\n");
#endif
//incep queryurile
freopen(fout,"w",stdout);
for ( i=1;i<=M;++i )
{
Z = query(X,Y);
if ( X == Y ) Z = 0;
X = ( X*A + Y*B ) % N + 1;
Y = ( Y*C + Z*D ) % N + 1;
if ( i + P > M )
printf("%d\n",Z);
}
}
void readdata()
{
int i;
freopen(fin,"r",stdin);
scanf("%d%d%d",&N,&M,&P);
for (i=1;i<N;++i)
scanf("%d%d",&tat[i+1],&cost[i+1]);
scanf("%d%d%d%d%d%d",&X,&Y,&A,&B,&C,&D);
}
int main()
{
readdata();
solve();
return 0;
}