#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define mp make_pair
#define pb push_back
#define R(i, l, r) for (int i = l; i <= r; ++i)
#define debug puts("--------------------------------------------")
typedef long long ll;
typedef pair<int, int> PII;
namespace kunkun
{
template <typename T>
il void read(T &x)
{
x = 0; T f = 1; char ch;
while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
}
template <typename T, typename ...L>
il void read(T &x, L &...y) {read(x); read(y...);}
template <typename T>
il void write(T x)
{
if (x < 0) ptc('-'), x = -x;
if (x > 9) write(x / 10);
ptc(x % 10 + '0');
}
template <typename T, typename ...L>
il void write(T &x, L &...y) {write(x), ptc(' '); write(y...);}
}
using namespace kunkun;
#define int ll
const int N = 5e5 + 5, M = 300;
int n, m, a[M][M], T[M], W[M];
struct Minimum_Cost_Maximum_Flow
{
int s, t, tot = 1, head[N], dep[N], now[N], flw, cst;
bool vis[N];
struct node
{
int u, v, nxt, cost; ll w;
} E[N];
void add(int u, int v, int w, int c)
{
E[++tot].u = u, E[tot].v = v, E[tot].w = w, E[tot].cost = c, E[tot].nxt = head[u];
head[u] = tot;
E[++tot].u = v, E[tot].v = u, E[tot].w = 0, E[tot].cost = -c, E[tot].nxt = head[v];
head[v] = tot;
}
bool spfa()
{
queue <int> q;
R(i, s, t) dep[i] = INT_MAX, now[i] = head[i], vis[i] = 0;
q.push(s), dep[s] = 0, vis[s] = 1;
while (q.size())
{
int x = q.front(); q.pop();
vis[x] = 0;
for (int i = head[x]; i; i = E[i].nxt)
{
int v = E[i].v;
if (E[i].w > 0 && dep[v] > dep[x] + E[i].cost)
{
dep[v] = dep[x] + E[i].cost;
if (!vis[v]) q.push(v), vis[v] = 1;
}
}
}
if (dep[t] == INT_MAX) return 0;
return 1;
}
int dfs(int x, ll tmp)
{
if (x == t) return tmp;
vis[x] = 1;
for (int i = now[x]; i; i = E[i].nxt)
{
now[x] = i;
int v = E[i].v;
if (!vis[v] && E[i].w > 0 && (dep[v] == dep[x] + E[i].cost))
{
int k = min(E[i].w, tmp);
int p = dfs(v, k);
if (!p) continue;
E[i].w -= p, E[i ^ 1].w += p;
cst += E[i].cost * p; return p;
}
}
return 0;
}
void dinic() {while (spfa()) while (int x = dfs(s, 1e9)) flw += x;}
} mcmf;
signed main()
{
// freopen("17.in", "r", stdin);
read(n, m); mcmf.s = 0, mcmf.t = n + m + 1;
R(i, 1, m)
{
int x; read(x);
mcmf.add(mcmf.s, i + n, x, 0); // S连物品
}
R(i, 1, n)
{
R(j, 1, m)
{
read(a[i][j]);
if (a[i][j]) mcmf.add(j + n, i, INT_MAX, 0); // 物品连人
}
}
R(i, 1, n)
{
int x; read(x);
R(j, 1, x) read(T[j]);
R(j, 1, x + 1) read(W[j]);
R(j, 1, x) mcmf.add(i, mcmf.t, T[j] - T[j - 1], W[j]);
mcmf.add(i, mcmf.t, INT_MAX, W[x + 1]);
}
mcmf.dinic();
write(mcmf.cst);
return 0;
}