#include <bits/stdc++.h>
using namespace std;
struct Maxflow {
  static const int MAXV = 20010;
  long long INF = 1000000000000000ll;
  struct Edge {
    int v, r;
    long long c;
    Edge(int _v, long long _c, int _r) : v(_v), c(_c), r(_r) {}
  };
  int s, t;
  vector<Edge> G[MAXV * 2];
  int iter[MAXV * 2], d[MAXV * 2], gap[MAXV * 2], tot;
  void init(int x) {
    tot = x + 2;
    s = x + 1, t = x + 2;
    for (int i = 0; i <= tot; i++) {
      G[i].clear();
      iter[i] = d[i] = gap[i] = 0;
    }
  }
  void addEdge(int u, int v, long long c) {
    G[u].push_back(Edge(v, c, ((int)(G[v]).size())));
    G[v].push_back(Edge(u, 0, ((int)(G[u]).size()) - 1));
  }
  long long dfs(int p, long long flow) {
    if (p == t) return flow;
    for (int &i = iter[p]; i < ((int)(G[p]).size()); i++) {
      Edge &e = G[p][i];
      if (e.c > 0 && d[p] == d[e.v] + 1) {
        long long f = dfs(e.v, min(flow, e.c));
        if (f) {
          e.c -= f;
          G[e.v][e.r].c += f;
          return f;
        }
      }
    }
    if ((--gap[d[p]]) == 0)
      d[s] = tot;
    else {
      d[p]++;
      iter[p] = 0;
      ++gap[d[p]];
    }
    return 0;
  }
  long long solve() {
    long long res = 0;
    gap[0] = tot;
    for (res = 0; d[s] < tot; res += dfs(s, INF))
      ;
    return res;
  }
} flow;
int n, m;
int main() {
  cin >> n >> m;
  flow.init(n + m + 5);
  for (int i = 1; i <= n; i++) {
    long long f;
    scanf("%lld", &f);
    flow.addEdge(m + i, flow.t, f);
  }
  long long tot = 0;
  for (int i = 1; i <= m; i++) {
    int x, y;
    long long f;
    scanf("%d%d%lld", &x, &y, &f);
    flow.addEdge(flow.s, i, f);
    flow.addEdge(i, m + x, flow.INF);
    flow.addEdge(i, m + y, flow.INF);
    tot += f;
  }
  printf("%lld\n", tot - flow.solve());
  return 0;
}
