← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

const INF int64 = 1e18

type Edge struct {
	to   int
	cap  int64
	flow int64
	rev  int
}

var graph [][]Edge
var level []int
var ptr []int

func addEdge(from, to int, cap int64) {
	graph[from] = append(graph[from], Edge{to, cap, 0, len(graph[to])})
	graph[to] = append(graph[to], Edge{from, 0, 0, len(graph[from]) - 1})
}

func bfs(s, t int) bool {
	for i := range level {
		level[i] = -1
	}
	level[s] = 0
	queue := make([]int, 0, len(level))
	queue = append(queue, s)
	for len(queue) > 0 {
		v := queue[0]
		queue = queue[1:]
		for _, edge := range graph[v] {
			if edge.cap-edge.flow > 0 && level[edge.to] == -1 {
				level[edge.to] = level[v] + 1
				queue = append(queue, edge.to)
			}
		}
	}
	return level[t] != -1
}

func dfs(v, t int, pushed int64) int64 {
	if pushed == 0 {
		return 0
	}
	if v == t {
		return pushed
	}
	for cid := ptr[v]; cid < len(graph[v]); cid++ {
		ptr[v] = cid
		edge := graph[v][cid]
		tr := edge.to
		if level[v]+1 != level[tr] || edge.cap-edge.flow == 0 {
			continue
		}
		push := pushed
		if edge.cap-edge.flow < push {
			push = edge.cap - edge.flow
		}
		p := dfs(tr, t, push)
		if p == 0 {
			continue
		}
		graph[v][cid].flow += p
		graph[tr][edge.rev].flow -= p
		return p
	}
	return 0
}

func dinic(s, t int) int64 {
	var flow int64 = 0
	for bfs(s, t) {
		for i := range ptr {
			ptr[i] = 0
		}
		for {
			pushed := dfs(s, t, INF)
			if pushed == 0 {
				break
			}
			flow += pushed
		}
	}
	return flow
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n, m int
	if _, err := fmt.Fscan(in, &n, &m); err != nil {
		return
	}

	if n == 0 {
		fmt.Println(0)
		return
	}

	nodes := n + m + 2
	graph = make([][]Edge, nodes)
	level = make([]int, nodes)
	ptr = make([]int, nodes)

	s := 0
	t := nodes - 1

	for i := 1; i <= n; i++ {
		var a int64
		fmt.Fscan(in, &a)
		addEdge(m+i, t, a)
	}

	var totalW int64 = 0
	for i := 1; i <= m; i++ {
		var u, v int
		var w int64
		fmt.Fscan(in, &u, &v, &w)
		totalW += w
		addEdge(s, i, w)
		addEdge(i, m+u, INF)
		addEdge(i, m+v, INF)
	}

	ans := totalW - dinic(s, t)
	if ans < 0 {
		ans = 0
	}
	fmt.Println(ans)
}
```