#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e3 + 100, M = N * 40, inf = 1e9;
int k, n, m, S, T;
int h[N], ne[M], ver[M], f[M], tot = 1;
int q[N], d[N], cur[N];
void add (int u, int v, int w) {
ver[ ++ tot] = v, f[tot] = w, ne[tot] = h[u], h[u] = tot;
}
bool bfs () {
memset (d, 0, sizeof d);
int hh = 0, tt = 0;
q[0] = S, d[S] = 1, cur[S] = h[S];
while (hh <= tt) {
int u = q[hh ++ ];
for (int i = h[u]; i; i = ne[i]) {
int v = ver[i];
if (!d[v] && f[i]) {
d[v] = d[u] + 1;
cur[v] = h[v];
if (v == T) return 1;
q[ ++ tt] = v;
}
}
}
return 0;
}
int find (int u, int limit) {
if (u == T) return limit;
int flow = 0;
for (int i = cur[u]; i && flow < limit; i = ne[i]) {
int v = ver[i];
cur[u] = i;
if (d[v] = d[u] + 1 && f[i]) {
int t = find(v, min(limit - flow, f[i]));
if (!t) d[v] = 0;
flow += t, f[i] -= t, f[i ^ 1] += t;
}
}
return flow;
}
int dinic () {
int res = 0, flow;
while (bfs()) while (flow = find(S, inf)) res += flow;
return res;
}
int main () {
cin >> k >> n;
S = n + k + 1, T = n + k + 2;
for (int i = 1, w; i <= k; i ++ ) cin >> w, m += w, add(n + i, T, w), add(T, n + i, 0);
for (int i = 1, p; i <= n; i ++ ) {
cin >> p;
add (S, i, 1), add(i, S, 0);
for (int j = 1, l; j <= p; j ++ ) cin >> l, add(i, n + l, 1), add(n + l, i, 0);
}
if (dinic() != m) cout << "No Solution!" << '\n';
else {
for (int i = 1; i <= k; i ++ ) {
cout << i << ':';
for (int j = h[n + i]; j; j = ne[j])
if (f[j] && ver[j] != T) cout << ver[j] << " ";
cout << '\n';
}
}
return 0;
}
半天没想明白到底怎么MLE的