1 #include<iostream>
2 #include<string>
3 #include<queue>
4 #include<stack>
5 #include<vector>
6 #include<map>
7 #include<cstdio>
8 #include<cstdlib>
9 #include<algorithm>
10 #include<set>
11 #include<list>
12 #include<iomanip>
13 #include<cstring>
14 #include<cmath>
15 #include<limits>
16 #include<cctype>
17 using namespace std;
18
19 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
22 #define lll __int128
23 #define Re register
24 #define mem(a,b) memset(a,(b),sizeof(a))
25 #define Design ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
26 typedef pair<int, int> intpair;
27 typedef pair<long long int, long long int> llpair;
28 typedef long long int ll;
29 const int INF = 0x3f3f3f3f;
30 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
31
32 const int maxn = 100010;
33
34 int cnt;
35 int n, k;
36
37 struct Edge
38 {
39 int v, nxt;
40 int w;
41 }e[maxn];
42
43 int head[maxn];
44
45 int d[maxn];
46 int now[maxn];
47 int st, ed;
48 int need[maxn];
49 map<int, vector<int>>ser;
50
51 void add_dinic(int u, int v)
52 {
53 e[++cnt].v = v;
54 e[cnt].w = 0;
55 e[cnt].nxt = head[u];
56 head[u] = cnt;
57 }
58
59 int dfs_dinic(int x, int flow)
60 {
61 if (x == ed) return flow;
62 int res = 0;
63 for (int i = now[x]; i != -1; i = e[i].nxt)
64 {
65 int v = e[i].v;
66 now[x] = i;
67 if (d[v] + 1 == d[x] && e[i].w > 0)
68 {
69 int k = dfs_dinic(v, min(e[i].w, flow));
70 if (k > 0 && x != st)
71 {
72 //debug(x << " " << v - n);
73 ser[v - n].push_back(x);
74 }
75 res += k;
76 flow -= k;
77 e[i].w -= k;
78 e[i ^ 1].w += k;
79 if (!flow) break;
80 }
81 }
82 return res;
83 }
84
85 bool bfs_dinic()
86 {
87 memset(d, 0, sizeof(d));
88 queue<int>q;
89 q.push(ed);
90 d[ed] = 1;
91 while (!q.empty())
92 {
93 int u = q.front();
94 q.pop();
95 for (int i = head[u]; i != -1; i = e[i].nxt)
96 {
97 int v = e[i].v;
98 if (!d[v] && e[i ^ 1].w > 0)
99 {
100 q.push(v);
101 d[v] = d[u] + 1;
102 }
103 }
104 }
105 return d[st] > 0;
106 }
107
108
109 int dinic()
110 {
111 int flow = 0;
112 while (bfs_dinic())
113 {
114 for (int i = 0; i <= ed; i++) now[i] = head[i];
115 flow += dfs_dinic(st, INF);
116 }
117 return flow;
118 }
119
120 inline void init()
121 {
122 memset(head, -1, sizeof(head));
123 }
124
125 void add(int u, int v,int w)
126 {
127 e[++cnt].v = v;
128 e[cnt].nxt = head[u];
129 head[u] = cnt;
130 e[cnt].w = w;
131 add_dinic(v, u);
132 }
133
134 int main()
135 {
136 Design;
137 cin >> k >> n;
138 st = maxn - 2;
139 ed = maxn - 1;
140 cnt = 1;
141 init();
142 mfor(i, 1, k) cin >> need[i], add(i + n, ed, need[i]);
143 mfor(i, 1, n)
144 {
145 add(st, i, 1);
146 int p;
147 cin >> p;
148 mfor(j, 1, p)
149 {
150 int t;
151 cin >> t;
152 add(i, t + n, 1);
153 }
154 }
155 dinic();
156 mfor(i, 1, k)
157 {
158 if (ser[i].size() < need[i])
159 {
160 cout << "No Solution!" << endl;
161 return 0;
162 }
163 }
164 mfor(i, 1, k)
165 {
166 cout << i << ": ";
167 mfor(j, 0, need[i] - 1)
168 {
169 cout << ser[i][j] << " ";
170 }
171 cout << endl;
172 }
173 return 0;
174 }