#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define int long long
using namespace std;
const int N = 500010,M = (N+10000)*2+10,INT = 1e9+7;
int e[M],ne[M],f[M],h[N],idx;
int cur[N],d[N],A[N];//A[i]表示入边-出边
int n,m,S,T,C,D;
void add(int a,int b,int c){
e[idx]=b,f[idx]=c,ne[idx]=h[a],h[a]=idx++;
e[idx]=a,f[idx]=0,ne[idx]=h[b],h[b]=idx++;
}
bool bfs(){
queue<int>q;
memset(d,-1,sizeof d);
d[S]=0;
q.push(S);
cur[S]=h[S];
while(q.size()){
int t=q.front();
q.pop();
for(int i=h[t];~i;i=ne[i]){
int ver=e[i];
if(d[ver]==-1&&f[i]){
d[ver]=d[t]+1;
cur[ver]=h[ver];
if(ver==T)return true;
q.push(ver);
}
}
}
return false;
}
int find(int u,int lim){
if(u==T)return lim;
int flow=0;
for(int i=cur[u];~i&&flow<lim;i=ne[i]){
cur[u]=i;
int ver=e[i];
if(d[ver]==d[u]+1&&f[i]){
int t=find(ver,min(f[i],lim-flow));
if(!t)d[ver]=-1;
f[i]-=t,f[i^1]+=t,flow+=t;
}
}
return flow;
}
int dinic(){
int r=0,flow;
while(bfs())while((flow=find(S,INT)))r+=flow;
return r;
}
signed main(){
while(cin>>n>>m){
memset(A,0,sizeof A);
memset(h,-1,sizeof h);
idx=0;
int s,t;
s=0,t=n+m+1;
for(int i=1;i<=m;i++){
int x;
cin>>x;
add(s,i,INT-x);//因为至少要拍x张
A[s]-=x,A[i]+=x;
}
for(int i=1;i<=n;i++){
cin>>C>>D;
add(m+i,t,D);//因为每天拍摄不超过D张
for(int j=1;j<=C;j++){
// int a,b,c;
// cin>>a>>b>>c;
// add(a+1,m+i,c-b);
// A[a+1]-=c,A[m+i]+=c;
int x,L,R;
cin>>x>>L>>R;
add(x+1,m+i,R-L);
A[x+1]-=L,A[m+i]+=L;
}
}
S=n+m+2,T=n+m+3;
int tot=0;
for(int i=0;i<=n+m+1;i++){
if(A[i]>0)add(S,i,A[i]),tot+=A[i];
else if(A[i]<0)add(i,T,-A[i]);
}
add(t,s,INT);
if(dinic()!=tot){
puts("-1");
puts("");
}else{
int res=f[idx-1];
f[idx-1]=f[idx-2]=0;
S=s,T=t;
cout<<(res+dinic())<<endl;
puts("");
}
}
return 0;
}