#include <iostream>
#define MAXN 1102
using namespace std; int C[MAXN][MAXN];
int F[MAXN][MAXN];
int P[MAXN];
int M[MAXN];
int PIG, REN;
int S, T; void dfs(int u)
{
for (int i = 0; i <= T; i++)
if (P[i] == -1 && C[u][i] > F[u][i])
{
P[i] = u;
M[i] = min(M[u], C[u][i] - F[u][i]);
if (i == T)
return;
dfs(i);
if (M[T] != INT_MAX)
return;
}
} int find()
{
fill_n(M, MAXN, INT_MAX);
fill_n(P, MAXN, -1);
P[S] = -2;
dfs(S);
if (M[T] == INT_MAX)
return 0;
else
return 1;
} int maxflow()
{
int flow = 0;
int u, v;
while (find())
{
for (v = T; v != S; v = u)
{
u = P[v];
F[u][v] += M[T];
F[v][u] -= M[T];
}
flow += M[T];
}
return flow;
} int ONE[MAXN]; int main()
{
int i, j, k;
int tmp;
while (scanf("%d %d", &PIG, &REN) != EOF)
{
memset(C, 0, sizeof(C));
memset(F, 0, sizeof(F));
memset(ONE, 0, sizeof(ONE));
S = 0;
T = PIG + REN + 1;
for (i = REN + 1; i < T; i++)
scanf("%d", &C[i][T]);
for (i = 1; i <= REN; i++)
{
scanf("%d", &j);
while (j--)
{
scanf("%d", &tmp);
tmp += REN;
if (ONE[tmp])
C[i][ONE[tmp]] = INT_MAX;
else
{
C[i][tmp] = INT_MAX;
ONE[tmp] = i;
}
}
scanf("%d", &C[S][i]);
}
printf("%d\n", maxflow());
}
return 0;
}
#define MAXN 1102
using namespace std; int C[MAXN][MAXN];
int F[MAXN][MAXN];
int P[MAXN];
int M[MAXN];
int PIG, REN;
int S, T; void dfs(int u)
{
for (int i = 0; i <= T; i++)
if (P[i] == -1 && C[u][i] > F[u][i])
{
P[i] = u;
M[i] = min(M[u], C[u][i] - F[u][i]);
if (i == T)
return;
dfs(i);
if (M[T] != INT_MAX)
return;
}
} int find()
{
fill_n(M, MAXN, INT_MAX);
fill_n(P, MAXN, -1);
P[S] = -2;
dfs(S);
if (M[T] == INT_MAX)
return 0;
else
return 1;
} int maxflow()
{
int flow = 0;
int u, v;
while (find())
{
for (v = T; v != S; v = u)
{
u = P[v];
F[u][v] += M[T];
F[v][u] -= M[T];
}
flow += M[T];
}
return flow;
} int ONE[MAXN]; int main()
{
int i, j, k;
int tmp;
while (scanf("%d %d", &PIG, &REN) != EOF)
{
memset(C, 0, sizeof(C));
memset(F, 0, sizeof(F));
memset(ONE, 0, sizeof(ONE));
S = 0;
T = PIG + REN + 1;
for (i = REN + 1; i < T; i++)
scanf("%d", &C[i][T]);
for (i = 1; i <= REN; i++)
{
scanf("%d", &j);
while (j--)
{
scanf("%d", &tmp);
tmp += REN;
if (ONE[tmp])
C[i][ONE[tmp]] = INT_MAX;
else
{
C[i][tmp] = INT_MAX;
ONE[tmp] = i;
}
}
scanf("%d", &C[S][i]);
}
printf("%d\n", maxflow());
}
return 0;
}