#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define ull unsigned long long
#define ui unsigned int
#define veci vector<int>
#define vecb vector<bool>
#define vecl vector<long long>
#define vecn vector<node>
#define vece vector<edge>
#define quei queue<int>
#define quen queue<node>
const int N = 3e5 + 10, inf = 0x5FFFFFFF;
const ll INF = 0x7FFFFFFFFFFFFFFF;
struct edge {
int x;
ll w;
int nxt;
};
int n, m;
edge e[N];
int head[N];
int ett = 1;
void addedge(int u, int v, ll w) {
ett++;
e[ett].nxt = head[u];
e[ett].w = w;
e[ett].x = v;
head[u] = ett;
}
void insert(int u, int v, ll w) {
addedge(u, v, w);
addedge(v, u, 0);
}
int tmp[N], depth[N];
bool build(int s, int t) {
for (int i = 1; i <= n + m + 4; i++)
depth[i] = inf, tmp[i] = head[i];
quei q;
q.push(s);
depth[s] = 0;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].x;
if (e[i].w && depth[v] == inf) {
depth[v] = depth[u] + 1;
q.push(v);
if (v == t)return 1;
}
}
}
return 0;
}
ll extend(int u, ll flow, int t) {
if (u == t)
return flow;
ll res = 0;
for (int i = tmp[u]; i; i = e[i].nxt) {
tmp[u] = i;
int v = e[i].x;
if (depth[v] == depth[u] + 1 && e[i].w) {
ll maxflow = extend(v, min(e[i].w, flow), t);
if (!maxflow)depth[v] = inf;
e[i].w -= maxflow;
e[i ^ 1].w += maxflow;
res += maxflow;
flow -= maxflow;
}
}
return res;
}
ll dinic(int s, int t) {
ll res = 0;
while (build(s, t))
res += extend(s, INF, t);
return res;
}
ll in[N], out[N];
void solve() {
ett = 1;
for (int i = 1; i <= n + m + 4; i++) {
head[i] = 0; in[i] = 0; out[i] = 0;
}
int s1 = n + m + 1;
int t1 = n + m + 2;
int s2 = n + m + 3;
int t2 = n + m + 4;
for (int i = 1; i <= m; i++) {
int g; cin >> g;
out[n + i] += g;
in[t1] += g;
insert(n + i, t1, g);
}
for (int i = 1; i <= n; i++) {
int c, d;
cin >> c >> d;
insert(s1, i, d);
for (int j = 1; j <= c; j++) {
int t, l, r;
cin >> t >> l >> r;
t++;
out[i] += l;
in[n + t] += l;
insert(i, n + t, r - l);
}
}
ll cnt = 0;
for (int i = 1; i <= n + m + 2; i++) {
if (in[i] > out[i]) {
insert(s2, i, in[i] - out[i]);
cnt += in[i] - out[i];
}
else insert(i, t2, out[i] - in[i]);
}
insert(s1, t1, inf);
ll ans = dinic(s2, t2);
if (ans != cnt) {
cout << -1;
return;
}
head[s1] = e[head[s1]].nxt;
head[t1] = e[head[t1]].nxt;
ans += dinic(s1, t1);
cout << ans;
return;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
while (cin >> n >> m) {
solve();
cout << '\n\n';
}
return 0;
}