#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<vector> #include<set> #include<map> using namespace std; #define mxn 820 #define inf 0x3f3f3f3f #define ll long long #define ull unsigned long long #define eps 1e-8 int g[mxn][mxn], flow[mxn][mxn], a[mxn], q[mxn*mxn], p[mxn]; int head, tail; int n, f, d; int main() { scanf( "%d%d%d", &n, &f, &d ); memset( g, 0, sizeof( g ) ); int tot = f + 2 * n + d + 1; for( int i = 1; i <= n; ++i ) { g[f+i][f+n+i] = 1; } for( int i = 1; i <= f; ++i ) g[0][i] = 1; for( int i = 1; i <= d; ++i ) g[f+2*n+i][tot] = 1; for( int i = 1; i <= n; ++i ) { int _f, _d; scanf( "%d%d", &_f, &_d ); int ff, dd; for( int j = 1; j <= _f; ++j ) { scanf( "%d", &ff ); g[ff][i+f] = 1; } for( int j = 1; j <= _d; ++j ) { scanf( "%d", &dd ); g[i+f+n][f+2*n+dd] = 1; } } int ans = 0; memset( flow, 0, sizeof( flow ) ); while( 1 ) { memset( a, 0, sizeof ( a ) ); a[0] = inf; head = tail = 0; q[tail++] = 0; while( head < tail ) { int u = q[head++]; for( int v = 0; v <= tot; ++v ) { if( !a[v] && g[u][v] > flow[u][v] ) { p[v] = u; q[tail++] = v; a[v] = min( a[u], g[u][v] - flow[u][v] ); } } } if( a[tot] == 0 ) break; for( int c = tot; c ; c = p[c] ) { flow[p[c]][c] += a[tot]; flow[c][p[c]] -= a[tot]; } ans += a[tot]; } printf( "%d\n", ans ); return 0; }