#include using namespace std; #define REP(i,a,n) for(int i=(a); i<(int)(n); i++) #define rep(i,n) REP(i,0,n) #define FOR(it,c) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it) #define ALLOF(c) (c).begin(), (c).end() typedef long long ll; typedef unsigned long long ull; template class SCC { vector G[MAX_V]; vector rG[MAX_V]; vector vs; bool used[MAX_V]; int V; vector cmp; void dfs(int v){ used[v] = true; for(int i=0; i get_edge(int from){ return G[from]; } vector get_cmp(){ return cmp; } void add_edge(int from, int to){ G[from].push_back(to); rG[to].push_back(from); } int calc(){ for(int i=0; i=0; i--) if(!used[vs[i]]) rdfs(vs[i], k++); return k; } }; int main(){ int n, m; cin >> n >> m; vector> memo(n); SCC<505> scc(n); rep(i,m){ int g, r; cin >> g >> r; g--; vector h(r); rep(j,r){ cin >> h[j]; h[j]--; scc.add_edge(h[j],g); } memo[g] = h; } scc.calc(); vector ret = scc.get_cmp(); vector> v; rep(i,ret.size()){ v.emplace_back(ret[i],i); } sort(ALLOF(v)); map get; rep(i,v.size()){ int x = v[i].second; if(memo[x].size() == 0) get[x] = 1; else{ bool flg = true; rep(j,memo[x].size()){ if(get.count(memo[x][j])==0) flg = false; } if(flg) get[x] = 1; } } cout << get.size() << endl; return 0; }