vector<int> adj[maxn]; int match[maxn]; bool vis[maxn];
booldfs( int u ){ for( int v : adj[u] ) { if( vis[v] ) continue; vis[v] = true; if( match[v] == 0 || dfs( match[v] ) ) { match[v] = u; returntrue; } } returnfalse; }
voidsolve( ){ int m = read( ), n = read( ); while( 1 ) { int u = read( ), v = read( ); if( u == -1 && v == -1 ) break; adj[u].push_back( v ); }
fill( match, match + maxn, 0 ); int ans = 0; for( int i = 1; i <= m; ++ i ) { fill( vis, vis + maxn, false ); if( dfs( i ) ) ++ ans; } cout << ans << '\n';
for( int v = m + 1; v <= n; ++ v ) { if( match[v] ) { cout << match[v] << " " << v << '\n'; } } }
for( int i = 1; i <= m; ++ i ) { add_edge( S, i, 1 ); }
for( int i = m + 1; i <= n; ++ i ) { add_edge( i, T, 1 ); }
while( 1 ) { int u = read( ), v = read( ); if( u == -1 && v == -1 ) break; add_edge( u, v, 1 ); }
ll mxflow = Dinic( S, T, n + 1 );
printf( "%lld\n", mxflow );
for( int u = 1; u <= m; ++ u ) { for( int id : adj[u] ) { auto [v, c] = edge[id]; if( v > m && v <= n && c == 0 ) { cout << u << " " << v << '\n'; break; } } } }