func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename A>   ostream &operator<<(ostream &cout, vector<A> const &v);   template <typename A, typename B>   ostream &operator<<(ostream &cout, pair<A, B> const &p) {     return cout <<  (  << p.first <<  ,   << p.second <<  ) ;   }   template <typename A>   ostream &operator<<(ostream &cout, vector<A> const &v) {     cout <<  [ ;     for (int i = 0; i < v.size(); i++) {       if (i) cout <<  ,  ;       cout << v[i];     }     return cout <<  ] ;   }   template <typename A, typename B>   istream &operator>>(istream &cin, pair<A, B> &p) {     cin >> p.first;     return cin >> p.second;   }   mt19937_64 rng(std::chrono::steady_clock::now().time_since_epoch().count());   void usaco(string filename) {     freopen((filename +  .in ).c_str(),  r , stdin);     freopen((filename +  .out ).c_str(),  w , stdout);   }   const long double pi = 3.14159265358979323846;   const long long mod = 1000000007;   struct dsu {     int n;     vector<int> sizes, marks;     vector<vector<int>> graph;     void init(int rn) {       n = rn;       sizes = vector<int>(n);       fill(sizes.begin(), sizes.end(), 1);       marks = vector<int>(n);       for (int i = 0; i < n; i++) marks[i] = i;       graph = vector<vector<int>>(n);     }     void mark(int m, int node) {       if (marks[node] == m) return;       marks[node] = m;       for (int i : graph[node]) mark(m, i);     }     bool merge(int a, int b) {       if (marks[a] == marks[b]) return 0;       graph[a].push_back(b);       graph[b].push_back(a);       if (sizes[marks[a]] > sizes[marks[b]]) swap(a, b);       sizes[marks[b]] += sizes[marks[a]];       sizes[marks[a]] = 0;       mark(marks[b], a);       return 1;     }     int find(int n) { return marks[n]; }   };   long long n, m, k, q, l, r, x, y, z;   const long long template_array_size = 1e6 + 6884;   long long a[template_array_size];   long long b[template_array_size];   long long c[template_array_size];   string second, t;   long long ans = 0;   pair<long long, pair<long long, long long>> vals[200005];   long long root[100005];   bool cnt[100005];   dsu d;   void solve(int tc = 0) {     cin >> m >> n;     for (long long i = 0; i < m; i++) cin >> a[i];     for (long long i = 0; i < n; i++) cin >> b[i];     long long ans = 0, second = 0;     for (long long i = 0; i < m; i++) {       cin >> x;       for (long long j = 0; j < x; j++) {         cin >> y;         --y;         ans += a[i] + b[y];         vals[second++] = make_pair(-a[i] - b[y], make_pair(i, y));       }     }     sort(vals, vals + second);     memset(cnt, 0, sizeof(cnt));     d.init(n);     for (long long i = 0; i < second; i++) {       long long a = vals[i].second.first, b = vals[i].second.second,                 val = vals[i].first;       if (!cnt[a]) {         cnt[a] = 1;         root[a] = b;         ans += val;       } else {         if (d.merge(root[a], b)) ans += val;       }     }     cout << ans <<   n ;   }   int main() {     { ios_base::sync_with_stdio(false); }     { cin.tie(NULL); }     cout << setprecision(12) << fixed;     int tc = 1;     for (int t = 0; t < tc; t++) solve(t);   }   