1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1050,K=30,oo=1e9;
4 int k,n,ss,tt,cnt[K];
5 struct Edge{
6 int from,to,flow,cap;
7 Edge(int _from=0,int _to=0,int _flow=0,int _cap=0):from(_from),to(_to),flow(_flow),cap(_cap){}
8 };
9 vector<int>res[K];
10 vector<Edge> edge;
11 int edge_tot;
12 vector<int>point[N];
13 void add_edge(int f,int t,int c){
14 edge.push_back(Edge(f,t,0,c));
15 point[f].push_back(edge_tot++);
16 edge.push_back(Edge(t,f,0,0));
17 point[t].push_back(edge_tot++);
18 return;
19 }
20 int level[N];
21 bool bfs(){
22 memset(level,0,sizeof(level));
23 queue<int>q;
24 q.push(ss);
25 level[ss]=1;
26 int x;
27 while(!q.empty()){
28 x=q.front();q.pop();
29 for(int i=0;i<point[x].size();i++){
30 Edge& e=edge[point[x][i]];
31 if(e.cap>e.flow&&!level[e.to]){
32 level[e.to]=level[x]+1;
33 q.push(e.to);
34 }
35 }
36 }
37 return level[tt];
38 }
39 int dfs(int k,int aa){
40 if(k==tt||!aa) return aa;
41 int temp,ans=0;
42 for(int i=0;i<point[k].size();i++){
43 Edge& e=edge[point[k][i]];
44 if(e.cap>e.flow&&level[e.to]==level[k]+1&&(temp=dfs(e.to,min(aa,e.cap-e.flow)))){
45 ans+=temp,aa-=temp;
46 e.flow+=temp,edge[point[k][i]^1].flow-=temp;
47 }
48 if(!aa) return ans;
49 }
50 return ans;
51 }
52 int dinic(){
53 int ans=0;
54 while(bfs()) ans+=dfs(ss,oo);
55 return ans;
56 }
57 int main(){
58 int t1,t2;
59 scanf("%d%d",&k,&n);
60 ss=k+n+1,tt=ss+1;
61 for(int i=1;i<=k;i++){
62 scanf("%d",&cnt[i]);
63 add_edge(n+i,tt,cnt[i]);
64 }
65 for(int i=1;i<=n;i++) add_edge(ss,i,1);
66 for(int i=1;i<=n;i++){
67 scanf("%d",&t1);
68 for(int j=1;j<=t1;j++){
69 scanf("%d",&t2);
70 add_edge(i,t2+n,1);
71 }
72 }
73 dinic();
74 for(int i=1;i<=k;i++){
75 if(edge[(i-1)<<1].cap>edge[(i-1)<<1].flow){
76 printf("No Solution!");
77 return 0;
78 }
79 }
80 for(int i=1;i<=n;i++)
81 for(int j=0;j<point[i].size();j++){
82 if(edge[point[i][j]].flow==1){
83 res[edge[point[i][j]].to-n].push_back(i);
84 break;
85 }
86 }
87 for(int i=1;i<=k;i++){
88 printf("%d:",i);
89 for(int j=0;j<res[i].size();j++) printf("%d ",res[i][j]);
90 printf("\n");
91 }
92 return 0;
93 }