//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include "september.h"
using namespace std;
const int sz=100001,INF=1000000000;
vector<int>parent(sz);
int get(int num)
{
if(parent[num]<0)
{
return num;
}
else
{
parent[num]=get(parent[num]);
return get(parent[num]);
}
}
void unite(int num1,int num2)
{
int res1=get(num1),res2=get(num2);
if(res1!=res2)
{
if(parent[res1]>parent[res2])
{
swap(res1,res2);
}
parent[res1]+=parent[res2],parent[res2]=res1;
}
}
int solve(int n,int m,vector<int>Nums,vector<vector<int>>nums)
{
fill(parent.begin(),parent.end(),-1);
int cnt,idx;
vector<int>numS;
set<int>nums1,nums2,res;
map<int,vector<int>>Res;
for(int i=n-1;i>=1;i--)
{
numS.push_back(i);
}
for(int i=0;i<nums.size();i++)
{
Res.clear(),cnt=0;
for(int j=0;j<nums[i].size();)
{
if(nums[i][j]==numS[j])
{
cnt++,Res[cnt].push_back(nums[i][j]),j++;
}
else
{
nums1.clear(),nums2.clear(),cnt++,idx=j;
while(idx<nums[i].size())
{
nums1.insert(nums[i][idx]),nums2.insert(numS[idx]),Res[cnt].push_back(nums[i][idx]),idx++;
if(nums1==nums2)
{
break;
}
}
j=idx+1;
}
}
for(auto RES:Res)
{
for(int j=0;j<RES.second.size()-1;j++)
{
unite(RES.second[j],RES.second[j+1]);
}
}
}
for(int i=1;i<=n-1;i++)
{
res.insert(get(i));
}
return res.size();
}