#include <bits/stdc++.h>
using namespace std;
template <class T>
using vc = vector<T>;
template <class T>
using vvc = vc<vc<T>>;
template <class T>
void mkuni(vector<T>& v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
}
long long rand_int(long long l, long long r) {
  static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
  return uniform_int_distribution<long long>(l, r)(gen);
}
template <class T>
void print(T x, int suc = 1) {
  cout << x;
  if (suc == 1)
    cout << '\n';
  else
    cout << ' ';
}
template <class T>
void print(const vector<T>& v, int suc = 1) {
  for (int i = 0; i < v.size(); i++)
    print(v[i], i == (int)(v.size()) - 1 ? suc : 2);
}
const int INF = 0x3f3f3f3f;
const int MAXN = 2e5 + 7;
const int maxn = 2e6 + 7;
int a[MAXN], b[MAXN];
int mx[maxn];
struct e {
  int u, v, w;
} Edge[maxn];
bool cmp(e a, e b) { return a.w > b.w; }
int fa[maxn];
int find(int x) { return (x == fa[x] ? x : fa[x] = find(fa[x])); }
int main() {
  int n, m, cnt = 0;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  for (int i = 1; i <= m; ++i) cin >> b[i];
  for (int i = 1; i <= n + m + 1; ++i) fa[i] = i;
  long long s = 0;
  for (int i = 1; i <= n; ++i) {
    int sz;
    cin >> sz;
    for (int j = 1; j <= sz; ++j) {
      int u;
      cin >> u;
      Edge[++cnt] = {u, i + m, a[i] + b[u]};
      s += (a[i] + b[u]);
    }
  }
  long long sum = 0;
  sort(Edge + 1, Edge + cnt + 1, cmp);
  for (int i = 1; i <= cnt; ++i) {
    int u = Edge[i].u, v = Edge[i].v, w = Edge[i].w;
    int fu = find(u), fv = find(v);
    if (fu == fv) continue;
    fa[fu] = fv;
    sum += w;
  }
  cout << s - sum << endl;
}
