#include <bits/stdc++.h>
using namespace std;
template <class flow_t, const flow_t inf>
struct Dinic {
  struct edge_t {
    long long to;
    flow_t cap, flow;
    edge_t(long long to = 0, flow_t cap = 0, flow_t flow = 0)
        : to(to), cap(cap), flow(flow) {}
  };
  long long n, s, t;
  vector<vector<long long>> g;
  vector<long long> d, ptr;
  vector<edge_t> ed;
  Dinic(long long n = 0, long long s = 0, long long t = 0) : n(n), s(s), t(t) {
    g.assign(n + 5, vector<long long>());
    ed.clear();
  }
  void add(long long u, long long v, long long cap) {
    g[u].push_back(ed.size());
    ed.push_back(edge_t(v, cap, 0));
    g[v].push_back(ed.size());
    ed.push_back(edge_t(u, 0, 0));
  }
  bool bfs() {
    d.assign(n + 5, -1);
    ptr.assign(n + 5, 0);
    queue<long long> q;
    d[s] = 0;
    q.push(s);
    while (!q.empty()) {
      long long u = q.front();
      q.pop();
      for (long long id : g[u]) {
        long long v = ed[id].to;
        if (d[v] == -1 && ed[id].cap > ed[id].flow) {
          d[v] = d[u] + 1;
          q.push(v);
        }
      }
    }
    return d[t] != -1;
  }
  flow_t dfs(long long u, flow_t flow) {
    if (u == t || !flow) return flow;
    for (long long& i = ptr[u]; i < (long long)g[u].size(); ++i) {
      long long id = g[u][i];
      long long v = ed[id].to;
      if (d[v] != d[u] + 1 || ed[id].cap <= ed[id].flow) continue;
      flow_t nxt = dfs(v, min(flow, ed[id].cap - ed[id].flow));
      if (nxt) {
        ed[id].flow += nxt;
        ed[id ^ 1].flow -= nxt;
        return nxt;
      }
    }
    return 0;
  }
  flow_t max_flow() {
    while (bfs())
      while (dfs(s, inf))
        ;
    flow_t ret = 0;
    for (long long id : g[s]) ret += ed[id].flow;
    return ret;
  }
  vector<long long> path;
  flow_t trace(long long u) {
    path.push_back(u);
    if (u == t) return 1;
    for (long long id : g[u]) {
      long long v = ed[id].to;
      if (ed[id].flow > 0) {
        ed[id].flow--;
        trace(v);
        return 1;
      }
    }
    return 0;
  }
  vector<vector<long long>> solve() {
    vector<vector<long long>> ret;
    while (true) {
      path.clear();
      if (trace(s))
        ret.push_back(path);
      else
        break;
    }
    return ret;
  }
};
signed main() {
  ios_base::sync_with_stdio(false);
  long long n, m;
  cin >> n >> m;
  long long s = 0, t = n + m + 1;
  Dinic<long long, (long long)1e18> dn(n + m, s, t);
  for (long long i = 1; i <= n; ++i) {
    long long x;
    cin >> x;
    dn.add(i, t, x);
  }
  long long sum = 0;
  for (long long i = 1; i <= m; ++i) {
    long long u, v;
    long long w;
    cin >> u >> v >> w;
    dn.add(n + i, u, 1e18);
    dn.add(n + i, v, 1e18);
    dn.add(s, n + i, w);
    sum += w;
  }
  cout << sum - dn.max_flow() << '\n';
}
