只过了hack
#include<bits/stdc++.h>
#define int long long
#define inf (0x3f3f3f3f)
#define toi (e[i].to)
#define roi (e[i^1].to)
#define tow (e[i].w)
#define row (e[i^1].w)
#define fore(now,i,c) for(int i=c[now];~i;i=e[i].next)
using namespace std;
int m,n,k,head[2005],cur[2005],num[2005],dp[2005],cnt=-1,s,t,ans=0;
bool vis[2005];
struct EDGE{
int to,next,w;
}e[50005<<1|1];
inline void init(){
memset(head,-1,sizeof(head));
memset(e,-1,sizeof(e));
}
inline void addedge(int u,int v,int w){
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
e[++cnt].to=v;
e[cnt].w=0;
e[cnt].next=head[v];
head[v]=cnt;
}
bool bfs(){
for(int i=0;i<2005;i++)
dp[i]=inf,cur[i]=head[i],vis[i]=false;
queue<int> q;
q.push(s);
dp[s]=0;
while(!q.empty()){
int now=q.front();
q.pop();
if(vis[now])
continue;
vis[now]=true;
fore(now,i,head)
if(tow&&dp[toi]>dp[now]+1){
dp[toi]=dp[now]+1;
q.push(toi);
}
}
return (dp[t]<inf);
}
int dfs(int now,int f){
if(now==t){
ans+=f;
return f;
}
int used=0;
fore(now,i,cur){
cur[now]=i;
if(tow&&dp[toi]==dp[now]+1){
int t=dfs(toi,min(tow,f-used));
if(!t)
continue;
used+=t;
tow-=t;
row+=t;
if(used==f)
break;
}
}
return used;
}
void Dinic(){
while(bfs())
dfs(s,inf);
}
signed main(){
init();
scanf("%lld%lld",&k,&n);
s=k+n+1,t=s+1;
for(int i=1;i<=k;i++)
scanf("%lld",num+i),addedge(i+n,t,num[i]),m+=num[i];
for(int i=1;i<=n;i++)
addedge(s,i,1);
for(int i=1,p;i<=n;i++){
scanf("%lld",&p);
for(int j=1,t;j<=p;j++)
scanf("%lld",&t),addedge(i,t+n,1);
}
Dinic();
if(ans!=m){
// printf("%lld\n",ans);
puts("No Solution!");
return 0;
}
for(int j=1;j<=k;j++,puts("")){
printf("%lld:",j);
for(int i=0;i<=cnt;i+=2){
if(toi==s||toi==t||roi==s||roi==t)
continue;
if(toi==j+n&&row)
printf(" %lld",roi);
}
}
return 0;
}