#include <bits/stdc++.h>
using namespace std;
using LL = long long;
template <class T = long long>
T mian() {
  T s = 0, f = 1;
  char ch;
  while (!isdigit(ch = getchar())) (ch == '-') && (f = -1);
  for (s = ch - '0'; isdigit(ch = getchar()); s = s * 10 + ch - '0')
    ;
  return s * f;
}
const long long maxn = 1e5 + 5;
const long long inf = 0x3f3f3f3f;
struct edge {
  long long to, flow;
  edge *next, *other;
} ed[maxn << 2], *tail = ed;
edge *head[maxn], *tmph[maxn];
void link(long long x, long long y, long long f) {
  edge *P = tail++, *Q = tail++;
  *P = (edge){y, f, head[x], Q};
  *Q = (edge){x, 0, head[y], P};
  head[x] = P;
  head[y] = Q;
}
long long dep[maxn];
bool bfs(long long s, long long t) {
  memset(dep, 0, sizeof(dep));
  queue<long long> q;
  q.push(s);
  dep[s] = 1;
  for (; !q.empty();) {
    long long x = q.front();
    q.pop();
    for (edge *i = head[x]; i; i = i->next) {
      if (i->flow && !dep[i->to]) {
        dep[i->to] = dep[x] + 1;
        q.push(i->to);
      }
    }
  }
  return dep[t];
}
long long dfs(long long x, long long t, long long lim) {
  if (x == t || !lim) return lim;
  long long flow = 0, f;
  for (auto &i = tmph[x]; i; i = i->next) {
    if (dep[i->to] == dep[x] + 1 && (f = dfs(i->to, t, min(lim, i->flow)))) {
      flow += f;
      i->flow -= f;
      lim -= f;
      i->other->flow += f;
      if (!lim) {
        break;
      }
    }
  }
  return flow;
}
long long work(long long s, long long t) {
  long long ans = 0;
  for (; bfs(s, t);) {
    memcpy(tmph, head, sizeof(head));
    ans += dfs(s, t, inf);
  }
  return ans;
}
long long n, m, s, t;
signed main() {
  long long sum = 0;
  n = mian(), m = mian();
  s = n + m + 1;
  t = s + 1;
  for (long long i = 1; i <= n; ++i) link(m + i, t, mian());
  for (long long i = 1; i <= m; ++i) {
    long long x = mian(), y = mian(), a = mian();
    link(s, i, a);
    link(i, x + m, inf);
    link(i, y + m, inf);
    sum += a;
  }
  cout << sum - work(s, t) << endl;
  return 0;
}
