#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
const int mod = 1e9 + 7;
int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0', c = getchar();
  return x * f;
}
struct Edge {
  int to, w, nxt;
  Edge() {}
  Edge(int v, int c, int t) : to(v), w(c), nxt(t) {}
};
const int EN = 1e4 + 10;
const int EM = 1e5 + 10;
struct Dinic {
  Edge e[EM << 1];
  int head[EN], scnt, d[EN], cur[EN];
  pair<int, int> pre[EN];
  Dinic() { scnt = 1; }
  void addEdge(int u, int v, int w) {
    e[++scnt] = Edge(v, w, head[u]);
    head[u] = scnt;
    e[++scnt] = Edge(u, 0, head[v]);
    head[v] = scnt;
  }
  bool bfs(int s, int t) {
    queue<int> q;
    memset(d, 0, sizeof(d));
    q.push(s);
    d[s] = 1;
    while (!q.empty()) {
      int x = q.front();
      q.pop();
      for (int i = head[x]; i; i = e[i].nxt) {
        int to = e[i].to;
        if (!d[to] && e[i].w) {
          d[to] = d[x] + 1;
          q.push(to);
          if (to == t) return true;
        }
      }
    }
    return false;
  }
  long long dfs(int x, int t, int flow) {
    if (x == t) return flow;
    long long res = 0;
    for (int i = cur[x]; i; i = e[i].nxt) {
      cur[x] = i;
      int to = e[i].to;
      if (d[to] == d[x] + 1 && e[i].w) {
        int dis = dfs(to, t, min(flow, e[i].w));
        if (dis) {
          e[i].w -= dis;
          e[i ^ 1].w += dis;
          flow -= dis;
          res += dis;
          if (!flow) return res;
        }
      }
    }
    return res;
  }
  long long Maxflow(int s, int t) {
    long long ans = 0;
    while (bfs(s, t)) {
      memcpy(cur, head, sizeof(head));
      ans += dfs(s, t, 0x3f3f3f3f);
    }
    return ans;
  }
} dc;
int a[N];
int main() {
  int n = read(), m = read();
  int cnt = n;
  long long sum = 0;
  int s = ++cnt, t = ++cnt;
  for (int i = 1; i <= n; i++) a[i] = read();
  for (int i = 1; i <= n; i++) dc.addEdge(i, s, 0), dc.addEdge(i, t, a[i]);
  for (int i = 1; i <= m; i++) {
    int u = read(), v = read(), w = read();
    ++cnt;
    dc.addEdge(cnt, u, 0x3f3f3f3f);
    dc.addEdge(cnt, v, 0x3f3f3f3f);
    dc.addEdge(s, cnt, w);
    sum += w;
  }
  printf("%lld\n", sum - dc.Maxflow(s, t));
}
