#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const long long inf = 0x3f3f3f3f3f3f3f3f;
const long long N = 2e3 + 10, M = 1e5 + 10;
long long n, m, h[N], s, t, res, cnt;
long long head[N], nex[M], to[M], w[M], tot = 1;
inline void ade(long long a, long long b, long long c) {
  to[++tot] = b;
  nex[tot] = head[a];
  w[tot] = c;
  head[a] = tot;
}
inline void add(long long a, long long b, long long c) {
  ade(a, b, c);
  ade(b, a, 0);
}
inline long long bfs() {
  queue<long long> q;
  q.push(s);
  memset(h, 0, sizeof h);
  h[s] = 1;
  while (q.size()) {
    long long u = q.front();
    q.pop();
    for (long long i = head[u]; i; i = nex[i]) {
      if (w[i] && !h[to[i]]) {
        h[to[i]] = h[u] + 1;
        q.push(to[i]);
      }
    }
  }
  return h[t];
}
long long dfs(long long x, long long f) {
  if (x == t) return f;
  long long fl = 0;
  for (long long i = head[x]; i && f; i = nex[i]) {
    if (w[i] && h[to[i]] == h[x] + 1) {
      long long mi = dfs(to[i], min(w[i], f));
      w[i] -= mi;
      w[i ^ 1] += mi;
      fl += mi;
      f -= mi;
    }
  }
  if (!fl) h[x] = -1;
  return fl;
}
long long dinic() {
  long long res = 0;
  while (bfs()) res += dfs(s, inf);
  return res;
}
signed main() {
  cin >> n >> m;
  t = n + m + 1;
  for (long long i = 1, x; i <= n; i++) cin >> x, add(i, t, x);
  for (long long i = 1, u, v, w; i <= m; i++) {
    cin >> u >> v >> w;
    res += w;
    add(s, i + n, w);
    add(i + n, u, inf);
    add(i + n, v, inf);
  }
  cout << res - dinic() << endl;
  return 0;
}
