#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline ll read()
{
ll x=0,w=1;
char aa=getchar();
while(aa<'0'||aa>'9')
{
if(aa=='-')
{
w=-1;
}
aa=getchar();
}
while(aa>='0'&&aa<='9')
{
x=(x<<3)+(x<<1)+aa-'0';
aa=getchar();
}
return x*w;
}
inline void write(ll x)
{
if(x<0)
{
putchar('-');
x=-1;
}
if(x>9)
{
write(x/10);
}
putchar(x%10+'0');
}
const int N=1e6+10,inf=2e9+7;
struct node{
int ver,nt,flow;
}e[N];
int n,m,c,d,ans,s1,t1,s2,t2,top=1;
int hd[N],dis[N],in[N],out[N],now[N];
queue<int> q;
void init(){
top=1;
memset(hd,0,sizeof(hd));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
}
void add(int x,int y,int z){
e[++top].ver=y;
e[top].flow=z;
e[top].nt=hd[x];
hd[x]=top;
}
bool bfs(int s,int t){
memset(dis,-1,sizeof(dis));
q.push(s);
dis[s]=0;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=hd[x];i;i=e[i].nt){
int y=e[i].ver;
if(e[i].flow&&dis[y]==-1){
dis[y]=dis[x]+1;
q.push(y);
}
}
}
return dis[t]!=-1;
}
int dfs(int x,int t,int ma){
if(x==t){
return ma;
}
int su=ma;
for(int i=now[x];i;i=e[i].nt){
now[x]=e[i].nt;
int y=e[i].ver;
if(e[i].flow&&dis[y]==dis[x]+1){
int d=dfs(y,t,min(su,e[i].flow));
su-=d;
e[i].flow-=d;
e[i^1].flow+=d;
if(!su){
return ma;
}
}
}
return ma-su;
}
int dinic(int s,int t){
int ss=0;
while(bfs(s,t)){
for(int i=1;i<=n+m+4;i++){
now[i]=hd[i];
}
ss+=dfs(s,t,inf);
}
return ss;
}
int main()
{
int x,y,t,l,r;
while(cin>>n>>m){
init();
s1=n+m+1,t1=n+m+2,s2=n+m+3,t2=n+m+4;
for(int i=1;i<=m;i++){
x=read();
out[n+i]+=x,in[t1]+=x;
add(n+i,t1,inf-x);
add(t1,n+i,0);
}
for(int i=1;i<=n;i++){
c=read(),d=read();
add(s1,i,d);
add(i,s1,0);
for(int j=1;j<=c;j++){
t=read()+1,l=read(),r=read();
out[i]+=l,in[n+t]+=l;
add(i,n+t,r-l);
add(n+t,i,0);
}
}
int sum=0;
for(int i=1;i<=n+m+2;i++){
if(in[i]>out[i]){
add(s2,i,in[i]-out[i]);
add(i,s2,0);
sum+=in[i]-out[i];
}
if(in[i]<out[i]){
add(i,t2,out[i]-in[i]);
add(t2,i,0);
}
}
add(t1,s1,inf);
add(s1,t1,0);
if(dinic(s2,t2)!=sum){
puts("-1");
puts("");
continue;
}
for(int i=hd[t1];i;i=e[i].nt){
if(e[i].ver==s1){
ans=e[i^1].flow;
e[i].flow=e[i^1].flow=0;
break;
}
}
printf("%lld\n",ans+dinic(s1,t1));
puts("");
}
return 0;
}