#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf (int)2e18
#define _ <<' '<<
#define nl '\n'
void solve(){
int n, k;
cin>>n>>k;
set<int> g[n];
for(int i = 0; i < n; i++){
int m;
cin>>m;
for(int j = 0; j < m; j++){
int x;
cin>>x;
g[i].insert(x);
g[x].insert(i);
}
}
set<pair<int,int>> st;
for(int i = 0; i < n; i++){
st.insert({g[i].size(), i});
}
int ans = 1;
while(!st.empty()){
int v = st.begin()->second;
st.erase(st.begin());
auto &gv = g[v];
n = gv.size();
vector<int> nb(n);
int i = 0;
for(int a : gv){
int j = 0;
for(int b : gv){
if(i < j and g[a].count(b)){
nb[i] += (1<<j);
nb[j] += (1<<i);
}
j++;
}
nb[i] += (1<<i);
i++;
}
int dp[1<<n];
dp[0] = 1;
for(int mk = 1; mk < 1<<n; mk++){
dp[mk] = 0;
int cnt = 0;
for(int i = 0; i < n; i++) if(mk & 1<<i) cnt++;
for(int i = 0; i < n; i++){
if(mk & 1<<i and (nb[i] & mk) == mk and dp[mk - (1<<i)]){
ans = max(ans, cnt+1);
dp[mk] = 1;
}
}
}
for(int x : gv){
st.erase({g[x].size(), x});
g[x].erase(v);
st.insert({g[x].size(), x});
}
}
cout<<ans;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);cout.tie(NULL);
int t = 1;
//cin>>t;
while(t--) solve();
return 0;
}