func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 1000000007, MAX = 100003;   const long long INF = 1LL << 60;   int par[MAX];   long long mini[MAX], cost[MAX];   void init(int n) {     for (int i = 0; i < n; i++) {       par[i] = i;       mini[i] = cost[i];     }   }   int root(int a) {     if (par[a] == a)       return a;     else       return par[a] = root(par[a]);   }   void unite(int a, int b) {     if (root(a) != root(b)) {       mini[root(a)] = min(mini[root(a)], mini[root(b)]);       par[root(b)] = root(a);     }   }   bool check(int a, int b) { return root(a) == root(b); }   int main() {     int N, M;     cin >> N >> M;     for (int i = 0; i < N; i++) {       scanf( %lld , &cost[i]);     }     init(N);     for (int i = 0; i < M; i++) {       int a, b;       scanf( %d%d , &a, &b);       a--;       b--;       unite(a, b);     }     set<pair<int, int>> SE;     for (int i = 0; i < N; i++) {       SE.insert({root(i), mini[root(i)]});     }     long long ans = 0;     for (auto it = SE.begin(); it != SE.end(); it++) {       ans += (*it).second;     }     cout << ans << endl;   }   