#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FF(i, a, b) for(int i=a; i=b; i--) #define REP(i, n) for(int i=0; i G[maxn]; stack S; void dfs1(int u) { pre[u] = low[u] = ++dfs_clock; S.push(u); REP(i, G[u].size()) { int v = G[u][i]; if(!pre[v]) { dfs1(v); low[u] = min(low[u], low[v]); } else if(!sccno[v]) low[u] = min(low[u], pre[v]); } if(low[u] == pre[u]) { scc_cnt++; for(;;) { int x = S.top(); S.pop(); sccno[x] = scc_cnt; if(x == u) break; } } } void find_scc(int n) { dfs_clock = scc_cnt = 0; CLR(pre, 0); CLR(sccno, 0); FF(i, 1, n+1) if(!pre[i]) dfs1(i); } void build() { uN = m, vN = n; int M = hungary(); uN = n+m-M, vN = m+n-M; FF(i, m+1, uN+1) FF(j, 1, vN+1) g[i][j] = 1; FF(i, n+1, vN+1) FF(j, 1, uN+1) g[j][i] = 1; CLR(use, 0); int x = m+1; FF(i, 1, n+1) { if(match[i] == 0) match[i] = x++; else use[match[i]] = 1; } x = n+1; FF(i, 1, m+1) if(!use[i]) match[x++] = i; } void solve(int N) { REP(i, N+1) G[i].clear(); FF(i, 1, N+1) FF(j, 1, N+1) if(g[j][i] && j != match[i]) G[match[i]].PB(j); find_scc(N); vector ans; FF(i, 1, n+1) { ans.clear(); FF(j, 1, m+1) if(g[j][i] && sccno[j] == sccno[match[i]]) ans.PB(j); int nc = ans.size(); printf("%d", nc); REP(j, nc) printf(" %d", ans[j]); puts(""); } } int main() { scanf("%d", &T); FF(kase, 1, T+1) { scanf("%d%d", &n, &m); CLR(g, 0); int x, y; FF(i, 1, n+1) { scanf("%d", &x); while(x--) { scanf("%d", &y); g[y][i] = 1; } } build(); printf("Case #%d:\n", kase); solve(uN); } return 0; }