program paper;
const maxn=2000;
var n,m:longint;
g:array[0..maxn,0..maxn]of longint;
que,d:array[0..maxn]of longint;
v:array[0..maxn]of boolean;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
function bfs(s,t:longint):boolean;
var i,l,r,u:longint;
begin
fillchar(que,sizeof(que),0);
fillchar(d,sizeof(d),0);
fillchar(v,sizeof(v),false);
l:=0;r:=1;que[l]:=s;v[s]:=true;
while l<r do
begin
u:=que[l];
for i:=0 to n+m+1 do
if (g[u][i]>0)and(not v[i]) then
begin
que[r]:=i;
inc(r);
d[i]:=d[u]+1;
v[i]:=true;
end;
inc(l);
end;
exit(v[t]);
end;
function dfs(p,a,t:longint):longint;
var flow,f,i:longint;
begin
if (p=t)or(a=0) then exit(a);
flow:=0;
for i:=0 to n+m+1 do
if (g[p][i]>0)and(d[i]=d[p]+1)then
begin
f:=dfs(i,min(g[p][i],a),t);
inc(flow,f);
inc(g[i][p],f);
dec(g[p][i],f);
dec(a,f);
if a=0 then break;
end;
exit(flow);
end;
function dinic(s,t:longint):longint;
var ans:longint;
begin
ans:=0;
while bfs(s,t) do
ans:=ans+dfs(s,maxlongint,t);
exit(ans);
end;
procedure init;
var tot,i,j,k,p,ans:longint;
begin
fillchar(g,sizeof(g),255);
read(m,n);
tot:=0;
for i:=1 to m do
begin
read(j);
g[i+n][n+m+1]:=j;
g[n+m+1][i+n]:=0;
inc(tot,j);
end;
for i:=1 to n do
begin
g[0][i]:=1;
g[i][0]:=0;
read(k);
for j:=1 to k do
begin
read(p);
g[i][p+n]:=1;
g[p+n][i]:=0;
end;
end;
ans:=dinic(0,n+m+1);
if ans<>tot then begin write('No Solution!');exit;end;
for i:=1+n to m+n do
begin
write(i-n,':');
for j:=1 to n do
if g[j][i]=0 then write(j,' ');
writeln;
end;
end;
begin
assign(input,'f.in');reset(input);
init;
close(input);
end.
评论