#include <bits/stdc++.h>using namespace std;
#define maxn 555#define maxm 3111#define INF 111111111struct Edge {
int u, v, cost;
}edge[maxm];
int pre[maxn], id[maxn], vis[maxn], in[maxn];
int zhuliu (int root, int n, int m) {
int res = 0,u,v;
while (1) {
for (int i = 0; i < n; i++)
in[i] = INF;
for (int i = 0; i < m; i++)
if (edge[i].u != edge[i].v && edge[i].cost < in[edge[i].v]) {
pre[edge[i].v] = edge[i].u;
in[edge[i].v] = edge[i].cost;
}
for (int i = 0;i < n;i++)
if (i != root && in[i] == INF)
return -1;//不存在最小树形图int tn = 0;
memset (id, -1, sizeof(id));
memset (vis, -1, sizeof(vis));
in[root] = 0;
for (int i = 0; i < n; i++) {
res += in[i];
v = i;
while ( vis[v] != i && id[v] == -1 && v != root) {
vis[v] = i;
v = pre[v];
}
if ( v != root && id[v] == -1 ) {
for (int u = pre[v]; u != v; u = pre[u])
id[u] = tn;
id[v] = tn++;
}
}
if (tn == 0) break;//没有有向环for (int i = 0; i < n;i++)
if (id[i] == -1)
id[i] = tn++;
for (int i = 0; i < m;) {
v = edge[i].v;
edge[i].u = id[edge[i].u];
edge[i].v = id[edge[i].v];
if (edge[i].u != edge[i].v)
edge[i++].cost -= in[v];
else
swap(edge[i],edge[--m]);
}
n = tn;
root = id[root];
}
return res;
}
int g[maxn][maxn], pos[maxn][maxn], pos_cnt;
int cnt, n, m;
int a[maxn];
int scan () {
char ch=' ';
while(ch<'0'||ch>'9')ch=getchar();
int x=0;
while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();
return x;
}
int main () {
while (scanf ("%d%d", &n, &m) == 2 && n+m) {
pos_cnt = cnt = 0;
for (int i = 1; i <= n; i++) a[i] = scan ();
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= a[i]; j++)
pos[i][j] = ++pos_cnt;
}
for (int i = 0; i <= pos_cnt; i++)
for (int j = 0; j <= pos_cnt; j++) {
g[i][j] = (i==j? 0 : INF);
}
int root = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= a[i]; j++) {
if (j == 0) g[0][pos[i][j]] = 0;
else g[pos[i][j]][pos[i][j-1]] = 0;
}
}
for (int i = 1; i <= m; i++) {
int u, l, v, r, cost;
u = scan (), l = scan (), v = scan (), r = scan (), cost = scan ();
g[pos[u][l]][pos[v][r]] = min (g[pos[u][l]][pos[v][r]], cost);
}
for (int i = 0; i <= pos_cnt; i++) {
for (int j = 0; j <= pos_cnt; j++) if (i != j && g[i][j] < INF) {
edge[cnt++] = (Edge) {i, j, g[i][j]};
}
}
printf ("%d\n", zhuliu (0, pos_cnt+1, cnt));
}
return0;
}