#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;
const int maxn = 500001;
vector<PIII> tree;
void dfs(int k, int last, int p)
{
	lefts[p][k] = ++cnt;
	for (int i = 0; i < g[k].size(); i++)
		if (g[k][i] != last)
		{
			dep[p][g[k][i]] = dep[p][k] + 1;
			dfs(g[k][i], k, p);
		}
	rights[p][k] = ++cnt;
}
void insert(int s, int &k, int l, int r, int ll ,int rr, int x)
{
	int mid = (l + r) >> 1;
	if (!k)
	{
		k = ++cnt;
		tree.push_back(ini);
	}
	if (ll == l && rr == r)
	{
		if (!s) insert(1, 2, 1, n, 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);
		}
	}
}
int main()
{
	while (scanf("%d%d",&n,&m)!=EOF)
	{
		rep(k,0,1) rep(i,1,n-1)
		{
			scanf("%d",&x);
			a[x].push_back(i+1);
			a[i+1].push_back(x);
		}
		cnt = 0;
		dep[0][1] = dep[1][1] = 1;
		dfs(1, -1, 0);
		cnt = 0;
		dfs(1, -1, 1);
		PIII ini = PIII(PII(0, 0), 0);
		cnt = 2;
		tree.push_back(ini);
		tree.push_back(ini);
		tree.push_back(ini);
		rep(i,1,n) insert(0, 1, 1, lefts[0][i], rights[0][i], i);
		ans = 0;
		while (m--)
		{
			scanf("%d%d", &x[0], &x[1]);
			x[0] = (x[0] + ans) % n + 1;
			x[1] = (x[1] + ans) % n + 1;
			ans = 1;
			query(0, 1, 
			printf("%d %d %d\n", ans, dep[0][ans] - dep[0][x[0]] + 1, dep[1][ans] - dep[1][x[1]] + 1);
		}
	}
}
