#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200100,mod=201314;
int e[2*N],ne[2*N],h[N],idx,w[N],cnt;
int fa[N],dep[N],son[N],top[N],siz[N],id[N];
struct Q
{
int ed,z,id,sg;
}q[2*N];
struct Yan
{
int l,r;
LL sum;
LL add;
}tr[N*4];
int n,qq;
LL ans[N*2];
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs1(int u,int pa)
{
siz[u]=1;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(j==pa) continue;
dep[j]=dep[u]+1,fa[j]=u;
dfs1(j,u);
siz[u]+=siz[j];
if(siz[j]>siz[son[u]]) son[u]=j;
}
return;
}
void dfs2(int u,int t)
{
top[u]=t,id[u]=++cnt;
if(son[u]) dfs2(son[u],t);
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(j==fa[u]||j==son[u]) continue;
dfs2(j,j);
}
return;
}
void pushup(Yan &u,Yan &l,Yan &r)
{
u.sum=(l.sum+r.sum)%mod;
return;
}
void pushup(int u)
{
pushup(tr[u],tr[u<<1],tr[u<<1|1]);
return;
}
void pushdown(Yan &u,Yan &l,Yan &r)
{
if(u.add)
{
l.sum=(l.sum+u.add*(l.r-l.l+1)%mod)%mod;
r.sum=(r.sum+u.add*(r.r-r.l+1)%mod)%mod;
l.add=(l.add+u.add)%mod;
r.add=(r.add+u.add)%mod;
u.add=0;
}
return;
}
void pushdown(int u)
{
pushdown(tr[u],tr[u<<1],tr[u<<1|1]);
return;
}
void build(int u,int l,int r)
{
tr[u]={l,r,0,0};
if(l==r) return;
int mid=(l+r)>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
LL query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum%mod;
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
LL res=0;
if(l<=mid) res=(res+query(u<<1,l,r))%mod;
if(r>mid) res=(res+query(u<<1|1,l,r))%mod;
return res%mod;
}
void modify(int u,int l,int r,int v)
{
if(tr[u].l>=l&&tr[u].r<=r)
tr[u].add=(tr[u].add+v)%mod,
tr[u].sum=(tr[u].sum+(tr[u].r-tr[u].l+1)*v%mod)%mod;
else
{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) modify(u<<1,l,r,v);
if(r>mid) modify(u<<1|1,l,r,v);
pushup(u);
}
return;
}
void modifypath(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
modify(1,id[top[x]],id[x],1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
modify(1,id[x],id[y],1);
return;
}
LL querypath(int x,int y)
{
LL ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=query(1,id[top[x]],id[x]);
ans%=mod;
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=query(1,id[x],id[y]);
return ans%mod;
}
bool cmp(Q &a,Q &b)
{
return a.ed<b.ed;
}
int main()
{
memset(h,-1,sizeof h);
scanf("%d%d",&n,&qq);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
x++;
add(i,x),add(x,i);
}
int tot=0;
for(int i=1;i<=qq;i++)
{
int l,r,z;
scanf("%d%d%d",&l,&r,&z);
z++;
q[++tot]={l,z,i,0};
q[++tot]={r+1,z,i,1};
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
sort(q+1,q+tot+1,cmp);
int s=1;
for(int i=1;i<=tot;i++)
{
while(s<=q[i].ed) modifypath(1,s++);
LL tha=querypath(1,q[i].z);
if(q[i].sg) ans[q[i].id]=(ans[q[i].id]+tha)%mod;
else ans[q[i].id]=(ans[q[i].id]-tha)%mod;
}
for(int i=1;i<=qq;i++)
printf("%lld\n",ans[i]);
return 0;
}