#include <bits/stdc++.h>
using namespace std;
template <class T>
using v2d = vector<vector<T>>;
template <class T>
bool uin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool uax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
const int maxN = 1e3 + 10;
const int maxM = 1e3 + 10;
const int maxS = maxN + maxM;
const long long inf = 1e16;
int n, m, s, t;
vector<int> adj[maxS];
long long cap[maxS][maxS], res = 0;
int p[maxS];
inline void add_edge(int u, int v) {
  adj[u].emplace_back(v);
  adj[v].emplace_back(u);
}
long long FindAugmentingPath() {
  for (int i = 1; i <= (int)(n + m + 2); ++i) {
    p[i] = -1;
  }
  p[s] = -2;
  queue<pair<int, long long>> pq;
  pq.emplace(s, inf);
  while (!pq.empty()) {
    int u = pq.front().first;
    long long flow = pq.front().second;
    pq.pop();
    for (auto &v : adj[u]) {
      if (p[v] == -1 && cap[u][v] > 0) {
        p[v] = u;
        long long new_flow = min(flow, cap[u][v]);
        if (v == t) {
          return new_flow;
        }
        pq.emplace(v, new_flow);
      }
    }
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> m;
  s = n + m + 1;
  t = n + m + 2;
  for (int i = 1; i <= (int)(n); ++i) {
    long long a;
    cin >> a;
    add_edge(i, t);
    cap[i][t] = a;
  }
  for (int i = 1; i <= (int)(m); ++i) {
    int u, v;
    long long w;
    cin >> u >> v >> w;
    res += w;
    add_edge(i + n, u);
    add_edge(i + n, v);
    cap[i + n][u] = inf;
    cap[i + n][v] = inf;
    add_edge(s, i + n);
    cap[s][i + n] = w;
  }
  long long new_flow;
  while (new_flow = FindAugmentingPath()) {
    res -= new_flow;
    int v = t;
    while (v != s) {
      int u = p[v];
      cap[u][v] -= new_flow;
      cap[v][u] += new_flow;
      v = u;
    }
  }
  cout << res;
  return 0;
}
