#include <bits/stdc++.h>
using namespace std;
int n, m, s, t, tot = 1, head[200010], cur[200010];
long long ans, d[200010], mincut;
struct Edge {
  int next, to;
  long long val;
} edge[400010];
inline void addedge(int from, int to, long long val) {
  edge[++tot].next = head[from];
  edge[tot].to = to;
  edge[tot].val = val;
  head[from] = tot;
  edge[++tot].next = head[to];
  edge[tot].to = from;
  edge[tot].val = 0;
  head[to] = tot;
}
inline long long read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - 48;
    ch = getchar();
  }
  return x * f;
}
bool bfs() {
  memset(d, 0, sizeof(d));
  queue<int> q;
  q.push(s);
  d[s] = 1;
  cur[s] = head[s];
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i; i = edge[i].next) {
      int v = edge[i].to;
      if (edge[i].val && !d[v]) {
        cur[v] = head[v];
        d[v] = d[u] + 1;
        q.push(v);
      }
    }
  }
  return d[t];
}
long long dfs(int u, long long in) {
  if (u == t || in == 0) return in;
  long long out = 0;
  for (int i = cur[u]; i && in; i = edge[i].next) {
    cur[u] = i;
    int v = edge[i].to;
    if (edge[i].val && d[v] == d[u] + 1) {
      long long res = dfs(v, min(edge[i].val, in));
      edge[i].val -= res;
      in -= res;
      edge[i ^ 1].val += res;
      out += res;
      if (in == 0) break;
    }
  }
  if (out == 0) d[u] = 0;
  return out;
}
int main() {
  n = read(), m = read();
  s = 0, t = n + m + 1;
  for (int i = 1; i <= n; i++) {
    int x = read();
    addedge(i + m, t, x);
  }
  for (int i = 1; i <= m; i++) {
    int x = read(), y = read(), p = read();
    addedge(s, i, p);
    addedge(i, m + x, 2147483647);
    addedge(i, m + y, 2147483647);
    ans += p;
  }
  while (bfs()) mincut += dfs(s, 1e18);
  ans -= mincut;
  cout << ans;
  return 0;
}
