#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#define INF ((1<<30)-1)
using namespace std;
vector<int> E, H, FirstPosition, lg;
vector<vector<int> > RMQ;
vector<vector<pair<int, int> > > DMIN, G;
vector<bool> used;
int N, M, P, x, y, z, A, B, C, D;
void read();
void Euler(int node, int h);
void preprocesare();
int LCA(int a, int b);
void Solve();
int minStreet(int node, int anc);
int main()
{
read();
Solve();
return 0;
}
void Solve()
{
Euler(1, 0);
preprocesare();
for(int i=1; i<=M; ++i) {
int anc = LCA(x, y);
if( x == y )
z = 0;
else if( x == anc)
z = minStreet(y, x);
else if(y == anc)
z = minStreet(x, y);
else
z = min(minStreet(x, anc), minStreet(y, anc));
if(i > M - P)
cout<<z<<'\n';
x = (x * A + y * B)%N + 1;
y = (y * C + z * D)%N + 1;
}
}
int minStreet(int node, int anc)
{
int length = H[node] - H[anc], ans = INF;
for(int k=0; k<=lg[length]; ++k)
if(length & (1<<k)) {
ans = min(ans, DMIN[node][k].second);
anc = DMIN[node][k].first;
}
return ans;
}
int LCA(int a, int b)
{
a = FirstPosition[a];
b = FirstPosition[b];
if(a > b)
swap(a, b);
int k = lg[b-a+1];
if(H[RMQ[a][k]] < H[RMQ[b-(1<<k)+1][k]])
return RMQ[a][k];
else
return RMQ[b-(1<<k)+1][k];
}
void preprocesare()
{
lg.assign(2, 0);
for(int i=2; i <= 2 * E.size() + 10; ++i)
lg.push_back(lg[i>>1] + 1);
int maxLog = lg[E.size()-1];
RMQ.assign(2 * E.size(), vector<int>(maxLog+2));
for(int i=0; i<E.size(); ++i)
RMQ[i][0] = E[i];
for(int k=1; k<=maxLog; ++k) {
for(int i=0; i<= E.size() - (1<<k) + 1; ++i)
if(H[RMQ[i][k-1]] < H[RMQ[i+(1<<(k-1))][k-1]])
RMQ[i][k] = RMQ[i][k-1];
else
RMQ[i][k] = RMQ[i+(1<<(k-1))][k-1];
for(int i=1; i<=N; ++i) {
DMIN[i][k].first = DMIN[ DMIN[i][k-1].first ][k-1].first;
DMIN[i][k].second = min(DMIN[i][k-1].second, DMIN[ DMIN[i][k-1].first ][k-1].second);
}
}
}
void Euler(int node, int h)
{
E.push_back(node);
H[node] = h;
FirstPosition[node] = E.size()-1;
used[node] = true;
for(int i=0; i<G[node].size(); ++i)
if(used[G[node][i].first] == false) {
Euler(G[node][i].first, h+1);
E.push_back(node);
DMIN[G[node][i].first][0] = make_pair(node, G[node][i].second);
}
}
void read()
{
freopen("atac.in", "rt", stdin);
freopen("atac.out", "wt", stdout);
scanf("%d%d%d", &N, &M, &P);
used.assign(N+2, false);
H.assign(N+2, 0);
FirstPosition.assign(N+2, 0);
G.assign(N+2, vector<pair<int, int> >());
DMIN.assign(N+2, vector<pair<int, int> >(18));
int a, v;
for(int i=2; i<=N; ++i)
{
scanf("%d%d", &a, &v);
G[a].push_back(make_pair(i, v));
G[i].push_back(make_pair(a, v));
}
scanf("%d%d%d%d%d%d", &x, &y, &A, &B, &C, &D);
}