import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
class GALACTIK {
StringBuilder output=new StringBuilder();
int N=read.nextInt();
int M=read.nextInt();
Graph obj=new Graph(N);
for (int i = 0; i <M ; i++) {
obj.addEdge(read.nextInt(),read.nextInt());
}
for (int i = 0; i <N ; i++) {
int t=read.nextInt();
if(t>=0)
obj.tax[i+1]=t;
else
}
obj.DFS();
}
static class Graph {
int V;
ArrayList<Integer> adj[];
int tax[];
Graph(int vertices){
V=vertices+1;
tax=new int[V];
for (int i = 0; i <V ; i++) {
adj[i]=new ArrayList<>();
}
}
void addEdge(int from,int to){
adj[from].add(to);
adj[to].add(from);
}
void DFS(){
boolean visited[]=new boolean[V];
int size=0;
boolean reach=true;
long sum=0;
for (int i = 1; i <V ; i++) {
if(!visited[i]){
int curr=DFSUtil(i,-1,visited);
reach=false;
sum+=(long)curr;
//finds global minimum
//count the number of components
size++;
}
}
//System.out.println(size);
if(size==1) //if there is only one component
sum=0;
if(size>2 && !reach) //if number of components>2 and there is a component which is not reachable
sum=-1;
if(size>2 && reach) //find cost required if all components are reachable
sum=sum+(size-2)*min;
}
//returns the local minimum of a component
int DFSUtil(int node,int parent,boolean visited[]){
visited[node]=true;
Iterator<Integer> itr=adj[node].iterator();
int min=tax[node];
while(itr.hasNext()){
int v=itr.next();
if(!visited[v]) {
min
= Math.
min(min, DFSUtil
(v, node, visited
)); }
}
return min;
}
}
{
final private int BUFFER_SIZE = 1 << 16;
private byte[] buffer;
private int bufferPointer, bytesRead;
{
buffer = new byte[BUFFER_SIZE];
bufferPointer = bytesRead = 0;
}
{
buffer = new byte[BUFFER_SIZE];
bufferPointer = bytesRead = 0;
}
{
byte[] buf = new byte[64]; // line length
int cnt = 0, c;
while ((c = read()) != -1)
{
if (c == '\n')
break;
buf[cnt++] = (byte) c;
}
return new String(buf,
0, cnt
); }
{
int ret = 0;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do
{
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg)
return -ret;
return ret;
}
{
long ret = 0;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
}
while ((c = read()) >= '0' && c <= '9');
if (neg)
return -ret;
return ret;
}
{
double ret = 0, div = 1;
byte c = read();
while (c <= ' ')
c = read();
boolean neg = (c == '-');
if (neg)
c = read();
do {
ret = ret * 10 + c - '0';
}
while ((c = read()) >= '0' && c <= '9');
if (c == '.')
{
while ((c = read()) >= '0' && c <= '9')
{
ret += (c - '0') / (div *= 10);
}
}
if (neg)
return -ret;
return ret;
}
{
bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
if (bytesRead == -1)
buffer[0] = -1;
}
{
if (bufferPointer == bytesRead)
fillBuffer();
return buffer[bufferPointer++];
}
{
if (din == null)
return;
din.close();
}
}
}
/*
8 7
1 2
2 3
1 3
4 5
5 6
4 6
7 8
1
3
5
2
4
6
7
5
8 7
1 2
2 3
1 3
4 5
5 6
4 6
7 8
1
3
5
2
4
6
-2
-3
3 3
1 2
2 3
3 1
-1
-2
-3
3 1
1 2
1
2
5
7 4
1 2
2 3
1 3
5 6
3
-1
-1
2
6
8
4
*/