#include <bits/stdc++.h>
using namespace std;
const int INF = 1E9 + 7;
const int N = 2005;
long long ans = 0;
int cnt = 0;
int n, m, a[N];
int d[N], vis[N];
int f[N][N], c[N][N];
vector<int> adj[N];
void AddEdge(int u, int v, int w) {
  adj[u].push_back(v);
  adj[v].push_back(u);
  c[u][v] += w;
}
void Read_Input() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    AddEdge(0, i, a[i]);
  }
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    AddEdge(i + n, n + m + 1, w);
    AddEdge(u, i + n, INF);
    AddEdge(v, i + n, INF);
    ans = ans + w;
  }
}
bool FindPath() {
  queue<int> Q;
  memset(d, 0, sizeof(d));
  d[0] = 1;
  Q.push(0);
  while (Q.size()) {
    int u = Q.front();
    Q.pop();
    if (u == n + m + 1) return 1;
    for (int i = 0; i < adj[u].size(); i++) {
      int v = adj[u][i];
      if (d[v] != 0) continue;
      if (c[u][v] - f[u][v] <= 0) continue;
      d[v] = d[u] + 1;
      Q.push(v);
    }
  }
  return 0;
}
int IncFlow(int u, int flow) {
  vis[u] = cnt;
  if (u == n + m + 1) return flow;
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i];
    if (vis[v] == cnt) continue;
    if (d[v] != d[u] + 1) continue;
    if (c[u][v] - f[u][v] <= 0) continue;
    int x = IncFlow(v, min(flow, c[u][v] - f[u][v]));
    if (x > 0) {
      f[u][v] += x;
      f[v][u] -= x;
      return x;
    }
  }
  return 0;
}
void Dinitz() {
  while (FindPath()) {
    int x;
    cnt++;
    while (x = IncFlow(0, INF)) {
      ans -= x;
      cnt++;
    }
  }
  printf("%I64d", ans);
}
int main() {
  Read_Input();
  Dinitz();
  return 0;
}
