#include <bits/stdc++.h>
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const ll N = 2E6 + 500, M = 1E7 + 500, INF = 2e18;
int n, m, k;
struct node {
int u, v;
ll cap, now;
int nt;
} ;
struct LIU{
ll S, T, c;
ll idx, h[N], cur[N];
node edge[M];
void add(ll u, ll v, ll c) {
edge[idx] = {u, v, c, 0, h[u]};
h[u] = idx++;
edge[idx] = {v, u, c, c, h[v]};
h[v] = idx++;
}
ll dis[N];
bool bfs() {
// cout<<"bfs"<<endl;
for (int i = 0; i <= 2*n; i++)
dis[i] = -1;
queue<int > q;
q.push(S), dis[S] = 0, cur[S] = h[S];
while (q.size()) {
int t = q.front();
// cout<<"t: "<<t<<endl;
q.pop();
for (int i = h[t]; ~i; i = edge[i].nt) {
int v = edge[i].v;
if (dis[v] == -1 && edge[i].cap > edge[i].now) {
dis[v] = dis[t] + 1;
cur[v] = h[v];
if (v == T)
return true;
q.push(v);
}
}
}
// cout<<"fail"<<endl;
return false;
}
ll find(int u, ll limit) {
if (u == T)
return limit;
ll flow = 0;
for (int i = cur[u]; ~i && flow < limit; i = edge[i].nt) {
cur[u] = i;
int v = edge[i].v;
if (dis[v] == dis[u] + 1 && edge[i].cap > edge[i].now) {
ll t = find(v, min(edge[i].cap - edge[i].now, limit - flow));
if (!t)
dis[v] = -1;//此路不通;
edge[i].now += t, edge[i ^ 1].now -= t, flow += t;
}
}
return flow;
}
ll dinic() {
ll res = 0, flow;
while (bfs())
while (flow = find(S, INF))
res += flow;
return res;
}
}Flow;
ll g[600][600];
ll from[N],to[N],wei[N];
void floyed(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
g[j][k] = min(g[j][k],g[j][i]+g[i][k]);
}
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
// cout<<n<<m<<endl;
memset(g,0x3f,sizeof(g));
for(int i=1;i<=n;i++){
g[i][i] = 0;
}
for(int i=1;i<=m;i++){
ll u,v,c;
cin>>from[i]>>to[i]>>wei[i];
u = from[i];
v = to[i];
c = wei[i];
g[u][v] = g[v][u] = min(g[u][v],c);
}
Flow.S = 1+n,Flow.T = n;
memset(Flow.h,-1,sizeof(Flow.h));
for(int i=1;i<=n;i++){
ll x;
cin>>x;
Flow.add(i,i+n,x);
}
floyed();
for(int i=1;i<=m;i++){
if(g[1][ from[i] ]+g[ to[i] ][n]+wei[i]==g[1][n]){
// cout<<"?"<<endl;
Flow.add(from[i]+n , to[i] , INF );
Flow.add(to[i]+n , from[i] , INF );
}
}
cout<<Flow.dinic();
return 0;
}