#include <bits/stdc++.h>
using namespace std;
const long long int inf = 1e15;
const int maxn = 101000, maxm = 100100;
struct Edge {
  int v, nxt;
  long long int f;
};
int n, m;
long long a[500005];
long long v[500005];
int src, sink;
int g[maxn + 10];
int nume, val[maxn];
Edge e[maxm * 2 + 10];
void addedge(int u, int v, long long int c) {
  e[++nume].v = v;
  e[nume].f = c;
  e[nume].nxt = g[u];
  g[u] = nume;
  e[++nume].v = u;
  e[nume].f = 0;
  e[nume].nxt = g[v];
  g[v] = nume;
}
void init() {
  memset(g, 0, sizeof(g));
  nume = 1;
}
queue<int> que;
bool vis[maxn + 10];
int dist[maxn + 10];
void bfs() {
  memset(dist, 0, sizeof dist);
  while (!que.empty()) que.pop();
  vis[src] = true;
  que.push(src);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (int i = g[u]; i; i = e[i].nxt) {
      if (e[i].f && !vis[e[i].v]) {
        que.push(e[i].v);
        dist[e[i].v] = dist[u] + 1;
        vis[e[i].v] = true;
      }
    }
  }
}
long long int dfs(int u, long long int delta) {
  if (u == sink) return delta;
  long long int ret = 0;
  for (int i = g[u]; delta && i; i = e[i].nxt) {
    if (e[i].f && dist[e[i].v] == dist[u] + 1) {
      long long int dd = dfs(e[i].v, min(e[i].f, delta));
      e[i].f -= dd;
      e[i ^ 1].f += dd;
      delta -= dd;
      ret += dd;
    }
  }
  return ret;
}
long long int maxflow() {
  long long int ret = 0;
  while (true) {
    memset(vis, 0, sizeof vis);
    bfs();
    if (!vis[sink]) return ret;
    ret += dfs(src, inf);
  }
}
long long ans;
int main() {
  scanf("%d%d", &n, &m);
  init();
  src = n + m + 10;
  sink = n + m + 20;
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    addedge(i, sink, a[i]);
  }
  for (int i = n + 1; i <= n + m; i++) {
    int x, y;
    scanf("%d%d%lld", &x, &y, &v[i]);
    addedge(src, i, v[i]);
    addedge(i, x, inf);
    addedge(i, y, inf);
    ans += v[i];
  }
  ans -= maxflow();
  printf("%lld\n", ans);
  return 0;
}
