import java.util.*;
public class Main {
static ArrayList<Integer>[] adj;
static int[] a;
static int m,n;
static boolean[] visited;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
n = input.nextInt();
m = input.nextInt();
a = new int[n+1];
visited = new boolean[n+1];
//初始化邻接表
adj = new ArrayList[n+1];
for(int i=1;i<=n;i++){
adj[i] = new ArrayList<>();
}
for(int i=1;i<=n;i++){
a[i] = input.nextInt();
}
for(int i=0;i<m;i++){
int u = input.nextInt();
int v = input.nextInt();
adj[u].add(v);
adj[v].add(u);
}
long ans = searchMinCost();
System.out.println(ans);
}
public static long searchMinCost(){
int cur=0;
long min = Integer.MAX_VALUE,sum =0;
for(int i=1;i<=n;i++){
if(!visited[i]){
cur = bfs(i);
sum += (long)cur;
min = Math.min(min,(long)cur);
}
}
return sum - min;
}
public static int bfs(int core){
Queue<Integer> q = new ArrayDeque<>();
int maxNum;
q.offer(core);
visited[core] = true;
maxNum = a[core];
while(q.size() != 0){
int cur = q.poll();
for(int x:adj[cur]){
if(!visited[x]){
q.offer(x);
visited[x] = true;
maxNum = Math.max(a[x],maxNum);
}
}
}
return maxNum;
}
}
BFS求每个连通分量的最大值,加和所有最大值,再减去最小的那个就是答案

京公网安备 11010502036488号