#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <set> using namespace std; #define maxn 120005 #define maxm 10005 struct edge { int u;int v;int cost; }es[maxn]; bool cmp(const edge& e1,const edge& e2) { return e1.cost < e2.cost; } int V,E,num = -1; int par[maxm]; void init(int n) { for(int i=0;i <= n;i++) par[i] = i; } int find(int x) { return par[x] = par[x] == x ? x : find(par[x]); } void unite(int x,int y) { int a = find(x),b= find(y); if(a != b) par[a] = b; } bool same(int x,int y) { return find(x) == find(y); } int kruskal() { sort(es,es+E,cmp); init(V); int res = 0; for(int i = 0;i < E;i++) { edge e = es[i]; if(!same(e.u,e.v) || e.cost<0) { unite(e.u,e.v); res += e.cost; } } return res; } int main() { scanf("%d%d",&V,&E); int a,b,val,c; for(int i = 1;i <= E;i++) { scanf("%d%d%d",&a,&b,&val); es[++num].u = a;es[num].v = b;es[num].cost = val; } int temp = kruskal(); int x; for (x = 2; x <= V; x++) if (find(1) != find(x)) break; if(x != V+1) { for(int i = 1; i <= V;i++) { scanf("%d",&c); if(c == -1) continue; E++; es[++num].u = 0;es[num].v = i;es[num].cost = c; } printf("%d",kruskal()); }else{ for(int i = 1; i <= V;i++) { scanf("%d",&c); if(c == -1) continue; E++; es[++num].u = 0;es[num].v = i;es[num].cost = c; } printf("%d",min(temp,kruskal())); } return 0; }