#include <bits/stdc++.h>
using namespace std;
mt19937 rng((int)chrono::steady_clock::now().time_since_epoch().count());
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
struct dinic {
  const bool scaling = false;
  int lim;
  struct edge {
    int to, cap, rev, flow;
    bool res;
    edge(int to_, int cap_, int rev_, bool res_)
        : to(to_), cap(cap_), rev(rev_), flow(0), res(res_) {}
  };
  vector<vector<edge>> g;
  vector<int> lev, beg;
  dinic(int n) : g(n) {}
  void add(int a, int b, int c) {
    g[a].push_back(edge(b, c, g[b].size(), false));
    g[b].push_back(edge(a, 0, g[a].size() - 1, true));
  }
  bool bfs(int s, int t) {
    lev = vector<int>(g.size(), -1);
    lev[s] = 0;
    beg = vector<int>(g.size(), 0);
    queue<int> q;
    q.push(s);
    while (q.size()) {
      int u = q.front();
      q.pop();
      for (auto& i : g[u]) {
        if (lev[i.to] != -1 or (i.flow == i.cap)) continue;
        if (scaling and i.cap - i.flow < lim) continue;
        lev[i.to] = lev[u] + 1;
        q.push(i.to);
      }
    }
    return lev[t] != -1;
  }
  int dfs(int v, int s, int f = INF) {
    if (!f or v == s) return f;
    for (int& i = beg[v]; i < g[v].size(); i++) {
      auto& e = g[v][i];
      if (lev[e.to] != lev[v] + 1) continue;
      int foi = dfs(e.to, s, min(f, e.cap - e.flow));
      if (!foi) continue;
      e.flow += foi, g[e.to][e.rev].flow -= foi;
      return foi;
    }
    return 0;
  }
  long long max_flow(int s, int t) {
    long long f = 0;
    for (lim = scaling ? (1 << 30) : 1; lim; lim /= 2)
      while (bfs(s, t))
        while (int ff = dfs(s, t)) f += ff;
    return f;
  }
  vector<pair<int, int>> get_cut(int s, int t) {
    max_flow(s, t);
    vector<pair<int, int>> cut;
    vector<int> vis(g.size(), 0), st = {s};
    vis[s] = 1;
    while (st.size()) {
      int u = st.back();
      st.pop_back();
      for (auto e : g[u])
        if (!vis[e.to] and e.flow < e.cap) vis[e.to] = 1, st.push_back(e.to);
    }
    for (int i = 0; i < g.size(); i++)
      for (auto e : g[i])
        if (vis[i] and !vis[e.to] and !e.res) cut.push_back({i, e.to});
    return cut;
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  dinic g(n + m + 2);
  int src = 0, snk = n + m + 1;
  for (int i = 1; i <= n; i++) {
    int a;
    cin >> a;
    g.add(i, snk, a);
  }
  long long sum = 0;
  for (int i = n + 1; i <= n + m; i++) {
    int l, r, a;
    cin >> l >> r >> a;
    sum += a;
    g.add(src, i, a);
    g.add(i, l, INF);
    g.add(i, r, INF);
  }
  sum -= g.max_flow(src, snk);
  cout << sum << '\n';
  exit(0);
}
