#include<stdio.h>
#include<iostream>
const int N=50010,MAX=201314;
int next[N]={0},fa[N]={0},d[N]={0},vis[N]={0};
int ver[N]={0},Next[N]={0},head[N]={0},edges[N]={0};
int tree[N][N]={0};
int tmp[N][3]={0},temp[N][3]={0};
int n,m,a,b,c,tot=0;
int lowbit(int x){
return x&-x;
}
void Tadd(int now,int x,int data){
for(int i=x;i<=n;i+=lowbit(i)){
tree[now][i]+=data;
}
return;
}
int query(int now,int x){
int sum=0;
for(int i=x;i>0;i-=lowbit(i)){
sum+=tree[now][i];
}
return sum;
}
void add(int x,int y,int z){
ver[++tot]=y,edges[tot]=z,Next[tot]=head[x],head[x]=tot;
return;
}
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void tarjan(int x){
vis[x]=1;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(vis[y]) continue;
d[y]=(d[x]+edges[i])%MAX;
tarjan(y);
fa[y]=x;
}
for(int i=tmp[x][0];i<=tmp[x][1]&&i;i++){
int y=i;
if(vis[y]==2){
int lca=find(y);
Tadd(x,y,d[lca]);
Tadd(y,x,d[lca]);
}
}
vis[x]=2;
return;
}
int main(){
scanf("%d%d",&n,&m);
d[1]=1;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=2;i<=n;i++){
scanf("%d",&c);
add(c+1,i,1),add(i,c+1,1);
}
fa[1]=1;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
a++,b++,c++;
temp[i][0]=a,temp[i][1]=b,temp[i][2]=c;
if(tmp[c][0]==0){
tmp[c][0]=a;
tmp[c][1]=b;
}else{
tmp[c][0]=std::min(a,tmp[c][0]);
tmp[c][1]=std::min(b,tmp[c][1]);
}
}
tarjan(1);
for(int i=1;i<=m;i++){
int sum=(query(temp[i][2],temp[i][1])-query(temp[i][2],temp[i][0]-1))%MAX;
if(temp[i][1]>=temp[i][2]&&temp[i][2]>=temp[i][0]) sum=(sum+d[temp[i][2]])%MAX;
printf("%d\n",sum);
}
return 0;
}