#include <bits/stdc++.h>
using namespace std;
int n, m;
struct edge {
  int from;
  int to;
  int next;
  long long flow;
} E[10005 << 1];
int sz = 1;
int head[10005];
void add_edge(int u, int v, long long w) {
  sz++;
  E[sz].from = u;
  E[sz].to = v;
  E[sz].next = head[u];
  E[sz].flow = w;
  head[u] = sz;
  sz++;
  E[sz].from = v;
  E[sz].to = u;
  E[sz].next = head[v];
  E[sz].flow = 0;
  head[v] = sz;
}
int deep[10005];
bool bfs(int s, int t) {
  queue<int> q;
  memset(deep, 0, sizeof(deep));
  q.push(s);
  deep[s] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = head[x]; i; i = E[i].next) {
      int y = E[i].to;
      if (E[i].flow && !deep[y]) {
        deep[y] = deep[x] + 1;
        if (y == t) return 1;
        q.push(y);
      }
    }
  }
  return 0;
}
long long dfs(int x, int t, long long minf) {
  if (x == t) return minf;
  long long k, rest = minf;
  for (int i = head[x]; i; i = E[i].next) {
    int y = E[i].to;
    if (E[i].flow && deep[y] == deep[x] + 1) {
      k = dfs(y, t, min(rest, E[i].flow));
      if (k == 0) deep[y] = 0;
      E[i].flow -= k;
      E[i ^ 1].flow += k;
      rest -= k;
      if (rest == 0) break;
    }
  }
  return minf - rest;
}
long long dinic(int s, int t) {
  long long maxflow = 0, nowflow = 0;
  while (bfs(s, t)) {
    while (nowflow = dfs(s, t, 0x3f3f3f3f3f3f3f3f)) maxflow += nowflow;
  }
  return maxflow;
}
int a[10005];
int main() {
  int u, v, w;
  scanf("%d %d", &n, &m);
  int s = 0, t = n + m + 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    add_edge(i, t, a[i]);
  }
  long long sum = 0;
  for (int i = 1; i <= m; i++) {
    scanf("%d %d %d", &u, &v, &w);
    sum += w;
    add_edge(s, i + n, w);
    add_edge(i + n, u, 0x3f3f3f3f3f3f3f3f);
    add_edge(i + n, v, 0x3f3f3f3f3f3f3f3f);
  }
  printf("%I64d\n", sum - dinic(s, t));
}
