#include<bits/stdc++.h>
#define rep(i,s,t) for (int i=s;i<=t;i++)
#define repp(i,s,t) for (int i=s;i>=t;i--)
using namespace std;
typedef pair<int, int> PII;
typedef pair<PII, int> PIII;
const int maxn = 100001;
int cnt;
PIII tree[maxn * 40];
int tmp;
int xx,y,n,m,q;
vector<int> g[2][maxn];
int dep[3][maxn];
int lefts[3][maxn], rights[3][maxn];
int x[3];
PIII ini = PIII(PII(0, 0), 0);
int one = 1;
void dfs(int k, int last, int p)
{
	lefts[p][k] = ++cnt;
	for (int i = 0; i < g[p][k].size(); i++)
		if (g[p][k][i] != last)
		{
			dep[p][g[p][k][i]] = dep[p][k] + 1;
			dfs(g[p][k][i], k, p);
		}
	rights[p][k] = ++cnt;
}
void insert(int s, int &k, int l, int r, int ll ,int rr, int x)
{
//	cout << s << " " << k << " " <<l << " " << r << " " << ll << " " << rr << " " << endl;
	int mid = (l + r) >> 1;
	if (!k)
	{
		k = ++cnt;
		tree[k] = ini;
	}
	if (ll == l && rr == r)
	{
		if (!s) insert(1, tree[k].second, 1, 2*n, lefts[1][x], rights[1][x], x);
		else tree[k].second = max(tree[k].second, x);
	}
	else
	{
		if (rr <= mid) insert(s, tree[k].first.first, l, mid, ll, rr, x);
		else if (ll > mid) insert(s, tree[k].first.second, mid+1, r, ll, rr, x);
		else
		{
			insert(s, tree[k].first.first, l, mid, ll, mid, x);
			insert(s, tree[k].first.second, mid+1, r, mid+1, rr, x);
		}
	}
}
void query(int s, int k, int l, int r, int xx)
{
	if (!k) return;
	if (l == xx && r == xx)
	{
		if (!s) query(1, tree[k].second, 1, 2*n, lefts[1][x[1]]);
		else tmp = max(tmp, tree[k].second);
		return;
	}
	if (!s) query(1, tree[k].second, 1, 2*n, lefts[1][x[1]]);
	else tmp = max(tmp, tree[k].second);
	int mid = (l + r) >> 1;
	if (xx <= mid) query(s, tree[k].first.first, l, mid, xx);
	else if (xx > mid) query(s, tree[k].first.second, mid+1, r, xx);

}
int main()
{
	while (scanf("%d%d",&n,&m)!=EOF)
	{
		rep(k,0,1) rep(i,1,n) g[k][i].clear();
		rep(k,0,1) rep(i,1,n-1)
		{
			scanf("%d",&xx);
			g[k][xx].push_back(i+1);
			g[k][i+1].push_back(xx);
		}
		
		dep[0][1] = dep[1][1] = 1;
		cnt = 0;
		dfs(1, -1, 0);
		cnt = 0;
		dfs(1, -1, 1);
		cnt = 1;
		tree[1] = ini;
		rep(i,1,n) insert(0, one, 1, 2*n, lefts[0][i], rights[0][i], i);
	//	rep(k,0,1) rep(i,1,n) cout << lefts[k][i] << " " << rights[k][i] << endl;
		tmp = 0;
		while (m--)
		{
			scanf("%d%d", &x[0], &x[1]);
			x[0] = (x[0] + tmp) % n + 1;
			x[1] = (x[1] + tmp) % n + 1;
			tmp = 1;
			query(0, one, 1, 2*n, lefts[0][x[0]]);
			printf("%d %d %d\n", tmp, -dep[0][tmp] + dep[0][x[0]] + 1, -dep[1][tmp] + dep[1][x[1]] + 1);
		}
	}
}

