#include <bits/stdc++.h>
using namespace std;
const int N = 10000, inf = ~0U >> 2, M = 20000;
struct edge {
  int t, f;
  edge *nxt, *pair;
} * g[N], *d[N], pool[M], *cur = pool;
int n, m, i, S, T, h[N], gap[N];
void add(int s, int t, int f) {
  edge* p = cur++;
  p->t = t;
  p->f = f;
  p->nxt = g[s];
  g[s] = p;
  p = cur++;
  p->t = s;
  p->f = 0;
  p->nxt = g[t];
  g[t] = p;
  g[s]->pair = g[t];
  g[t]->pair = g[s];
}
int sap(int v, int flow) {
  if (v == T) return flow;
  int rec = 0;
  for (edge* p = d[v]; p; p = p->nxt)
    if (h[v] == h[p->t] + 1 && p->f) {
      int ret = sap(p->t, min(flow - rec, p->f));
      p->f -= ret;
      p->pair->f += ret;
      d[v] = p;
      if ((rec += ret) == flow) return flow;
    }
  if (!(--gap[h[v]])) h[S] = T;
  gap[++h[v]]++;
  d[v] = g[v];
  return rec;
}
int main() {
  scanf("%d%d", &n, &m);
  S = n + m + 1, T = S + 1;
  for (cur = pool, i = 1; i <= T; i++) g[i] = d[i] = NULL, h[i] = gap[i] = 0;
  long long ans = 0;
  for (i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    add(i, T, x);
  }
  for (i = 1; i <= m; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    add(i + n, x, inf);
    add(i + n, y, inf);
    add(S, i + n, z);
    ans += z;
  }
  for (gap[0] = T, i = 1; i <= T; i++) d[i] = g[i];
  while (h[S] < T) ans -= sap(S, inf);
  printf("%lld\n", ans);
}
