#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int in[N],out[N],g[N],d[N],now[N],tot,sum,n,m,s,t;
struct P{int v,w;}a[N];
vector<int> e[N];
queue<int> q;
void addedge(int u,int v,int w)
{
tot++;
a[tot]={v,w};
e[u].push_back(tot);
tot++;
a[tot]={u,0};
e[u].push_back(tot);
}
bool bfs()
{
while(!q.empty()) q.pop();
memset(d,0x3f,sizeof(d));
d[s]=0;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int id:e[u])
{
int v=a[id].v,w=a[id].w;
if(d[v]<d[0]||w==0) continue;
d[v]=d[u]+1;
q.push(v);
}
}
return d[t]<d[0];
}
int dinic(int u,int flow)
{
if(u==t||flow==0) return flow;
int sum=flow;
for(int i=0;i<e[u].size();i++)
{
int v=a[e[u][i]].v,w=a[e[u][i]].w;
if(d[v]!=d[u]+1||w==0) continue;
int val=dinic(v,min(sum,w));
if(val==0) d[v]=0;
a[e[u][i]].w-=val;
a[e[u][i]^1].w+=val;
sum-=val;
if(sum==0) break;
}
return flow-sum;
}
int main()
{
while(scanf("%d %d",&n,&m))
{
int s1=n+m+1,t1=n+m+2,s2=n+m+3,t2=n+m+4;
s=s2,t=t2;
sum=0,tot=1;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(now,0,sizeof(now));
for(int i=1;i<=m;i++)
{
scanf("%d",&g[i]);
in[t1]+=g[i];
out[n+i]+=g[i];
addedge(n+i,t1,2e9);
}
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
addedge(s1,i,y);
for(int j=1;j<=x;j++)
{
int pos,l,r;
cin >> pos >> l >> r;
pos++;
in[n+pos]+=l,out[i]+=l;
addedge(i,n+pos,r-l);
}
}
for(int i=1;i<=n+m+2;i++)
{
if(in[i]>out[i])
{
addedge(s,i,in[i]-out[i]);
sum+=in[i]-out[i];
}
else addedge(i,t,out[i]-in[i]);
}
addedge(t1,s1,2e9);
int Dinic=0;
while(bfs())
{
while(true)
{
int tmp=dinic(s,2e9);
Dinic+=tmp;
if(tmp==0) break;
}
}
if(Dinic!=sum)
{
printf("-1\n\n");
continue;
}
int sm=a[tot].w;
a[tot].w=a[tot^1].w=0;
s=s1,t=t1;
while(bfs())
{
while(true)
{
int tmp=dinic(s,2e9);
sm+=tmp;
if(tmp==0) break;
}
}
printf("%d\n\n",sm);
}
return 0;
}
```cpp