#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#include"september.h"
using ll=long long;
#define rep(i,n) for(ll i=0;i<(n);++i)
#define repr(i,n) for(ll i=(n)-1;i>=0;--i)
#define repa(i,m,n) for(ll i=(m);i<(n);++i)
#define repra(i,m,n) for(ll i=(n)-1;i>=(m);--i)
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
constexpr ll INF=1LL<<60;
struct ll2{ll a,b;friend auto operator<=>(ll2,ll2)=default;};
struct ll3{ll a,b,c;friend auto operator<=>(ll3,ll3)=default;};
struct ll4{ll a,b,c,d;friend auto operator<=>(ll4,ll4)=default;};
template<typename T>
ostream& operator<<(ostream& os,vector<T> A){
os<<'(';
for(T a:A)os<<a<<' ';
os<<')';
return os;
}
constexpr ll m1=998244353,m2=988244353,m3=1145141919;
int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S){
vector<vector<ll>> G(N);
repa(i,1,N)G[F[i]].push_back(i);
set<ll> T;
rep(i,N)T.insert(i);
vector<set<ll3>> U(N);
vector<ll> p1={1},p2={1},p3={1};
rep(i,N){
p1.push_back(p1[i]*2%m1);
p2.push_back(p2[i]*2%m2);
p3.push_back(p3[i]*2%m3);
}
for(auto A:S){
vector<ll> vis(N,0);
ll c=0;
A.push_back(0);
ll3 s={0,0,0};
rep(i,N){
auto dfs=[&](auto&&dfs,ll x)->int{
if(vis[x])return 0;
++c;
vis[x]=1;
for(ll y:G[x])dfs(dfs,y);
return 0;
};
--c;
dfs(dfs,A[i]);
s={(s.a+p1[A[i]])%m1,(s.b+p2[A[i]])%m2,(s.c+p3[A[i]])%m3};
if(c)T.erase(i);
else U[i].insert(s);
}
}
ll ans=-1;
for(ll i:T)if(U[i].size()==1)++ans;
return ans;
}