#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll inf = 0x3f3f3f3f3f3f3f3f;
const int maxv = 2020;
const int maxe = 5020;
int s, t;
struct edge_node {
  int to, nxt;
  ll flow;
} edge[maxe << 1];
int head[maxv], id = 2, cur[maxv];
inline void add_edge(int u, int v, ll flow) {
  edge[id] = edge_node{v, head[u], flow};
  head[u] = id++;
  edge[id] = edge_node{u, head[v], 0};
  head[v] = id++;
}
int depth[maxv];
bool bfs() {
  memcpy(cur, head, sizeof(cur));
  memset(depth, 0, sizeof(depth));
  queue<int> que;
  depth[s] = 1;
  que.emplace(s);
  while (!que.empty()) {
    auto u = que.front();
    que.pop();
    for (int i = head[u]; i; i = edge[i].nxt) {
      int v = edge[i].to;
      ll flow = edge[i].flow;
      if (flow != 0 && depth[v] == 0) {
        depth[v] = depth[u] + 1;
        que.emplace(v);
      }
    }
  }
  return depth[t] != 0;
}
ll dfs(int u, ll flow) {
  if (u == t) {
    return flow;
  }
  ll res = 0;
  for (int i = cur[u]; i; i = edge[i].nxt) {
    cur[u] = i;
    int v = edge[i].to;
    if (depth[v] == depth[u] + 1 && edge[i].flow != 0) {
      ll temp = dfs(v, min(flow, edge[i].flow));
      edge[i].flow -= temp;
      edge[i ^ 1].flow += temp;
      res += temp;
      flow -= temp;
      if (flow == 0) {
        break;
      }
    }
  }
  if (flow != 0 || res == 0) {
    depth[u] = 0;
  }
  return res;
}
inline ll dinic() {
  ll ans = 0;
  while (bfs()) {
    ans += dfs(s, inf);
  }
  return ans;
}
int n, m;
signed main() {
  std::ios_base::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
  ll sum = 0;
  cin >> n >> m;
  s = 0, t = n + m + 1;
  for (int i = 1; i <= n; ++i) {
    ll w;
    cin >> w;
    add_edge(i, t, w);
  }
  for (int i = 1; i <= m; ++i) {
    int x, y;
    ll w;
    cin >> x >> y >> w;
    sum += w;
    add_edge(s, i + n, w);
    add_edge(i + n, x, inf);
    add_edge(i + n, y, inf);
  }
  ll min_cut = dinic();
  cout << sum - min_cut << '\n';
  return 0;
}
