题目link
#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const int MAXN = 1e2 + 10;
const int MAXM = 6e3 + 10;
const int inf = 0x3f3f3f3f;
int head[MAXN],d[MAXN];
int n,m,s,t,cnt,x,maxflow,flow,sum;
struct node{
int nxt,v,w;
}e[MAXM<<1];
void add(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
e[++cnt].v=u;
e[cnt].w=0;
e[cnt].nxt=head[v];
head[v]=cnt;
}
bool bfs(){
memset(d,0,sizeof(d));
d[s]=1;
queue<int>q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt){
if(e[i].w&&!d[e[i].v]){
d[e[i].v]=d[u]+1;
if(e[i].v==t) return 1;
q.push(e[i].v);
}
}
}
return 0;
}
int dinic(int x,int flow){
if(x==t) return flow;
int rest=flow,k;
for(int i=head[x];i;i=e[i].nxt){
if(e[i].w&&d[e[i].v]==d[x]+1){
k=dinic(e[i].v,min(rest,e[i].w));
if(!k) d[e[i].v]=0;
e[i].w-=k;
e[i^1].w+=k;
rest-=k;
}
}
return flow-rest;
}
int main(){
scanf("%d%d",&m,&n);
s=n+m+1,t=s+1,cnt=1;
FL(i,1,m){
scanf("%d",&x);
add(s,i,x);
sum+=x;
while(~scanf("%d",&x)) add(i,m+x,inf);
}
FL(i,1,n){
scanf("%d",&x);
add(m+i,t,x);
}
while(bfs()){
while(flow=dinic(s,inf)){
maxflow+=flow;
}
}
FL(i,1,m){
if(d[i]) printf("%d ",i);
}
printf("\n");
FL(i,1,n){
if(d[i+m]) printf("%d ",i);
}
printf("\n");
printf("%d\n",sum-maxflow);
return 0;
}