#7 TLE
蒟蒻写的dfs和并查集都T在这个点QAQ
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int M=2e6+5;
int nex[M],to[M],p;
int head[N],vis[N];
void add(int a,int b){
nex[++p]=head[a];
head[a]=p;
to[p]=b;
}
int n,m;
int ans;
void dfs(int u){
vis[u]=1;
ans++;
for(int i=head[u];i;i=nex[i]){
int v=to[i];
if(!vis[v]) dfs(v);
}
}
int read(){
int x=0,w=1;
char ch=0;
while(ch<'0' || ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<3)+(x<<1)+(ch-'0');
ch=getchar();
}
return x*w;
}
void write(int x){
if(x<0){
x=-x;
putchar('-');
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int main(){
n=read();
m=read();
for(int i=1;i<=m;i++){
int k,u,v;
k=read();
u=read();
for(int j=2;j<=k;j++){
v=read();
add(u,v);
add(v,u);
}
}
dfs(1);
write(ans);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m;
int fa[N];
int ans;
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void merge(int a,int b){
int t1,t2;
t1=find(a);
t2=find(b);
if(t1!=t2) fa[t1]=t2;
}
int read(){
int x=0,w=1;
char ch=0;
while(ch<'0' || ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<3)+(x<<1)+(ch-'0');
ch=getchar();
}
return x*w;
}
void write(int x){
if(x<0){
x=-x;
putchar('-');
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int k,u,v;
k=read();
u=read();
for(int j=2;j<=k;j++){
v=read();
merge(u,v);
}
}
for(int i=1;i<=n;i++)
if(find(1)==find(i)) ans++;
write(ans);
return 0;
}