#include <cstdio>
#include <vector>
#define mp make_pair
#define f first
#define s second
using namespace std;
const int N = 32005;
const int INF = 0x3f3f3f3f;
int nr, m, p ,n, v[N], P[2 * N], rmq[18][2 * N], A, B, C, D, X, Y, Z, c[N], ENTER[N], L[N];
vector<int> a[N];
void dfs(int k ) {
int i;
P[++nr] = k;
ENTER[k] = nr;
for(i = 0; i < a[k].size(); ++i)
if(!v[a[k][i]]) {
v[a[k][i]] = v[k] + 1;
dfs(a[k][i]);
P[++nr] = k;
}
}
void solve_rmq() {
int i, j;
L[1] = 0;
for(i = 1; i <= n; ++i){
L[i * 2] = L[i] + 1;
L[i * 2 + 1] = L[i] + 1;
}
v[1] = INF;
for(i = 2; i <= n; ++i)
v[i] = c[i];
for(i = 1; i <= nr; ++i)
rmq[0][i] = P[i];
for(i = 1; i <= L[nr]; ++i)
for(j = 1; j <= (nr - 1 << i) + 1; ++j) {
rmq[i][j] = rmq[i - 1][j];
if(v[rmq[i][j]] > v[rmq[i - 1][j + 1 << (i - 1 )]])
rmq[i][j] = rmq[i][j + 1 <<(i - 1 )];
}
}
int RMQ(int x, int y) {
int w = L[y - x + 1];
int p = 1 << L[w];
if(v[rmq[w][x]] < v[rmq[w][y - p + 1]])
return rmq[w][x];
else
return rmq[w][y - p + 1];
}
int main() {
freopen("atac.in", "r", stdin);
freopen("atac.out", "w", stdout);
int i, x ,y;
scanf("%d", &n, &m, &p);
for(i = 1; i <= n; ++i)
scanf("%d %d", &x, &y), a[i + 1].push_back(x), a[x].push_back(i + 1), c[i] = y;
v[1] = 1;
dfs(1);
scanf("%d %d %d %d %d %d", &X, &Y, &A, &B, &C, &D);
solve_rmq();
for(i = m; i >= 1; --i) {
if(ENTER[X] <= ENTER[Y])
Z = RMQ(ENTER[X], ENTER[Y]);
else
Z = RMQ(ENTER[Y], ENTER[X]);
if(i <= p)
printf("%d\n", Z);
x = X;
y = Y;
X = (x * A + y * B) % n + 1;
Y = (y * C + Z * D) % n + 1;
printf("%d %d\n", X, Y);
}
return 0;
}