/*
TASK:food
LANG:C++
*/

#include <cstdio>
#include <vector>

const int MAXN = 160;
const int MAXM = 1 << 14;
const int INF = 2000000;

struct el {
	int to;
	int cap;
	int next;
	el () {}
	el (int _to, int _cap, int _next) : to (_to), cap (_cap), next (_next) {}
};

int n, m;
int N, M;
int source, sink;
int vec[MAXN];
el buf[MAXM];
std::vector <int> gr[MAXN];
int prom[MAXN];

inline int op (int a) {return a ^ 1;}

int D[MAXN];
bool used[MAXN];
bool bfs () {
//	printf ("bfs\n");
	static int queue[MAXN], p3;
	static int i, j, crnt;

	for (i = 0; i < MAXN; ++i) {
		D[i] = -1;
		used[i] = 0;
	}
	used[source] = 1;
	D[sink] = 0;
	queue[p3 = 0, p3++] = sink;

	for (i = 0; i < p3; ++i) {
		crnt = queue[i];
//		printf ("popped %d\n", crnt);
		for (j = vec[crnt]; j != -1; j = buf[j].next) {
//			printf ("try go %d (%d %d)\n", buf[j].to, D[buf[j].to], buf[op (j)].cap);
			if (D[buf[j].to] == -1 && buf[op (j)].cap) {
				D[buf[j].to] = D[crnt] + 1;
				queue[p3++] = buf[j].to;
			}
		}
	}
//	for (i = 0; i < N; ++i) printf ("%d ", D[i]); printf ("\n");
//	printf ("ret %d\n", D[source] != -1);
	return D[source] != -1;
}

void prnt () {
	for (int i = 0; i < N; ++i) {
		printf ("%d ->", i);
		for (int j = vec[i]; j != -1; j = buf[j].next)
			printf (" (%d %d)", buf[j].to, buf[j].cap);
		printf ("\n");
	}
}

int vl[MAXM], vp;
int dfs (int a) {
//	printf ("dfs %d\n", a);
	if (a == sink) {
		used[a] = 0;
//		printf ("----!\n");
		return INF;
	}

	for (int tmp, i = vec[a]; i != -1; i = buf[i].next) {
		if (D[buf[i].to] + 1 == D[a] && !used[buf[i].to] && buf[i].cap) {
			used[buf[i].to] = 1;
			vl[vp++] = i;
			if ((tmp = dfs (buf[i].to))) {return tmp < buf[i].cap ? tmp : buf[i].cap;}
			--vp;
		}
	}
//	printf ("<-\n");
	return 0;
}

void dinitz () {
	int cflow;
	while (bfs ()) {
//		prnt ();
		while (vp = 0, cflow = dfs (source)) {
//			printf ("flow = %d\n", cflow);
			for (int i = 0; i < vp; ++i) {
				buf[vl[i]].cap -= cflow;
				buf[op (vl[i])].cap += cflow;
			}
		}
	}
}

int main () {
	scanf ("%d %d", &n, &m);

	source = m + n;
	sink = source + 1;
	N = sink + 1;
	int i, j;
	int a, b, bp = 0;
	for (i = 0; i < N; ++i) vec[i] = -1;
	for (i = 0; i < n; ++i) {
		scanf ("%d", &a);

		buf[bp] = el (i, a, vec[source]);
		vec[source] = bp++;

		buf[bp] = el (source, 0, vec[i]);
		vec[i] = bp++;
	}

	for (i = 0; i < m; ++i) {
		scanf ("%d", &a);

		buf[bp] = el (sink, a, vec[i + n]);
		vec[i + n] = bp++;

		buf[bp] = el (i + n, 0, vec[sink]);
		vec[sink] = bp++;

		prom[i] = a;
		scanf ("%d", &a);
		for (j = 0; j < a; ++j) {
			scanf ("%d", &b);
			--b;
			buf[bp] = el (i + n, INF, vec[b]);
			vec[b] = bp++;

			buf[bp] = el (b, 0, vec[i + n]);
			vec[i + n] = bp++;
			
			gr[i].push_back (b);
		}
	}
//	printf ("%d %d\n", source, sink);
//	prnt ();
	dinitz ();

	int win = 0;
	static bool buy[MAXN];
	for (j = vec[source]; j != -1; j = buf[j].next)
		if (!buf[j].cap) {
			buy[buf[j].to] = !buf[j].cap;
			win -= buf[op (j)].cap;
		}

	for (i = 0; i < m; ++i) {
		for (j = 0; j < (int)gr[i].size (); ++j)
			if (!buy[gr[i][j]]) break;
		if (j == (int)gr[i].size ())
			win += prom[i];
	}

	printf ("%d\n", win >? 0);

	return 0;
}
