#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=500005;
int dep[N],lon[N],hei[N],fa[N][21],hf[N],htop[N],highbit[N];
vector<int> g[N],up[N],dn[N];
void dfs1(int u,int p){
dep[u]=dep[p]+1,lon[u]=0,fa[u][0]=p,hf[u]=p;
for(int i=1;fa[u][i-1] && i<20;++i,fa[u][i]=fa[fa[u][i-1]][i-1]){fa[u][i]=fa[fa[u][i-1]][i-1];}
for(vector<int>::iterator it=g[u].begin();it!=g[u].end();++it){
int v=*it;
if(v!=p) dfs1(v,u);
if(!lon[u] || hei[lon[u]]<hei[v]){
lon[u]=v;
}
else
lon[u]=0;
}
hei[u]=lon[u]?hei[lon[u]]+1:1;
}
void dfs3(int u,int p,int htp){
htop[u]=htp;
if(u==htp){
for(int v=u;v;v=lon[v])
dn[u].push_back(v);
for(int v=u;v && up[u].size()<dn[u].size();v=hf[v])
up[u].push_back(v);
}
if(lon[u]) dfs3(lon[u],u,htp);
for(vector<int>::iterator it=g[u].begin();it!=g[u].end();++it){
int v=*it;
if(v!=p && v!=lon[u])
dfs3(v,u,v);
}
}
int kthans(int u,int k){
if(dep[u]<=k) return (0-0);
if(k==0) return u;
u=fa[u][highbit[k]],k-=1<<highbit[k];
int d=dep[u]-k-dep[htop[u]];
return d>=0?dn[htop[u]][d]:dn[htop[u]][-d];
}
int rt;
int ans;
#define ui unsigned int
ui s;
inline ui get(ui x) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return s = x;
}
int n,m;
signed main(){
cin>>n>>m;
cin>>s;
for(int i=2;i<=n;++i){
highbit[i]=highbit[i>>1]+1;
}
rt=1;
for(int i=1;i<=n;++i){
int x;
cin>>x;
if(!x) rt=i;
else g[x].push_back(i);
}
dep[0]=0;
dfs1(rt,0);
dfs3(rt,rt,rt);
int lsans(0);
for(int i=1;i<=m;++i){
int x=(get(s)^lsans)%n+1,k=(get(s)^lsans)%dep[x];
lsans=kthans(x,k);
cout<<x<<' '<<k<<' '<<lsans<<endl;
ans^=(i*lsans);
}
cout<<ans<<endl;
return (0-0);
}