#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
struct p{int to,nxt;
}d[maxn]; int head[maxn],cnt=1,n,q;
void add(int u,int v){d[cnt]=(p){ v,head[u] },head[u]=cnt++;
}
int fa[maxn][22],deep[maxn],lg[maxn];
void dfs(int u,int father)
{deep[u]=deep[father]+1,fa[u][0]=father;for(int i=1;i<=lg[ deep[u] ];i++)fa[u][i]=fa[ fa[u][i-1] ][i-1];for(int i=head[u];i;i=d[i].nxt){int v=d[i].to;if( v==father ) continue;dfs(v,u);}
}int lca(int x,int y)
{if( deep[x]<deep[y] ) swap(x,y);while( deep[x]>deep[y] )x=fa[x][ lg[deep[x]-deep[y]]-1 ];if( x==y ) return x;for(int i=lg[ deep[x] ]-1;i>=0;i--)if( fa[x][i]!=fa[y][i] )x=fa[x][i],y=fa[y][i];return fa[x][0];
}
void init(){for(int i=1;i<=200000;i++) lg[i]=lg[i-1]+(i==(1<<lg[i-1]) );
}
int get_dis(int x,int y){int u=lca(x,y);
// cout << x << "和" << y << "的lca是" << u << endl;return deep[x]+deep[y]-2*deep[u];
}
int main()
{cin >> n >> q;init();for(int i=2,l;i<=n;i++){scanf("%d",&l);add(i,l); add(l,i);}dfs(1,0);while( q-- ){int a,b,c,ans;scanf("%d%d%d",&a,&b,&c);int ab=get_dis(a,b);int bc=get_dis(b,c);int ac=get_dis(a,c);// cout << ab << " " << bc << " " << ac << endl;int na=( ac+ab-bc )/2;int nb=( ab+bc-ac )/2;int nc=( bc+ac-ab )/2;ans=max(na,max(nb,nc) )+1;printf("%d\n",ans);}
}