#include <bits/stdc++.h>   using namespace std;   long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }   long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }   long long powmod(long long a, long long b, long long MOD) {     if (a == 0ll) {       return 0ll;     }     a %= MOD;     long long ans = 1;     while (b) {       if (b & 1) {         ans = ans * a % MOD;       }       a = a * a % MOD;       b >>= 1;     }     return ans;   }   long long poww(long long a, long long b) {     if (a == 0ll) {       return 0ll;     }     long long ans = 1;     while (b) {       if (b & 1) {         ans = ans * a;       }       a = a * a;       b >>= 1;     }     return ans;   }   void Pv(const vector<int> &V) {     int Len = int(V.size());     for (int i = 0; i < Len; ++i) {       printf( %d , V[i]);       if (i != Len - 1) {         printf(   );       } else {         printf(  n );       }     }   }   void Pvl(const vector<long long> &V) {     int Len = int(V.size());     for (int i = 0; i < Len; ++i) {       printf( %lld , V[i]);       if (i != Len - 1) {         printf(   );       } else {         printf(  n );       }     }   }   inline long long readll() {     long long tmp = 0, fh = 1;     char c = getchar();     while (c <  0  || c >  9 ) {       if (c ==  - ) fh = -1;       c = getchar();     }     while (c >=  0  && c <=  9 ) tmp = tmp * 10 + c - 48, c = getchar();     return tmp * fh;   }   inline int readint() {     int tmp = 0, fh = 1;     char c = getchar();     while (c <  0  || c >  9 ) {       if (c ==  - ) fh = -1;       c = getchar();     }     while (c >=  0  && c <=  9 ) tmp = tmp * 10 + c - 48, c = getchar();     return tmp * fh;   }   void pvarr_int(int *arr, int n, int strat = 1) {     if (strat == 0) {       n--;     }     for (int i = strat; i <= n; i++) {       printf( %d%c , arr[i], i == n ?   n  :    );     }   }   void pvarr_LL(long long *arr, int n, int strat = 1) {     if (strat == 0) {       n--;     }     for (int i = strat; i <= n; i++) {       printf( %lld%c , arr[i], i == n ?   n  :    );     }   }   const int maxn = 1000010;   const int inf = 0x3f3f3f3f;   int n, m;   long long a[maxn], b[maxn];   struct node {     int f, t;     long long val;     node() {}     node(int ff, int tt, long long vv) {       f = ff;       t = tt;       val = vv;     }     bool operator<(const node &bb) const { return val > bb.val; }   };   std::vector<node> v;   int far[maxn];   void dsu_init(int n) {     for (int i = 0; i <= n; i++) {       far[i] = i;     }   }   int findpar(int x) {     if (x == far[x]) {       return x;     } else {       return far[x] = findpar(far[x]);     }   }   void mg(int x, int y) {     x = findpar(x);     y = findpar(y);     if (x == y) return;     far[x] = y;   }   long long maxst() {     dsu_init(n + m);     sort((v).begin(), (v).end());     long long res = 0ll;     for (auto e : v) {       int x = e.f;       int y = e.t;       x = findpar(x);       y = findpar(y);       if (x != y) {         res += e.val;         far[x] = y;       }     }     return res;   }   int main() {     m = readint();     n = readint();     for (int i = 1; i <= m; i++) {       a[i] = readll();     }     for (int i = 1; i <= n; i++) {       b[i] = readll();     }     long long ans = 0ll;     for (int i = 1; i <= m; i++) {       int k = readint();       while (k--) {         int x = readint();         ans += a[i] + b[x];         v.push_back(node(i, m + x, a[i] + b[x]));         v.push_back(node(m + x, i, a[i] + b[x]));       }     }     printf( %lld n , ans - maxst());     return 0;   }