#include <bits/stdc++.h>
const int32_t MAX_N = 1e5;
const int32_t MAX_M = 1e5;
struct Edge {
  int32_t u, v, w;
  Edge() {}
  Edge(int32_t _u, int32_t _v, int32_t _w) : u(_u), v(_v), w(_w) {}
  bool operator<(const Edge &o) const { return w > o.w; }
};
struct Dsu {
  int32_t parent[MAX_N + MAX_M + 5], siz[MAX_N + MAX_M + 5];
  void init(int32_t n) {
    for (int32_t i = 0; i < n; i++) {
      parent[i] = i;
      siz[i] = 1;
    }
  }
  int32_t find_parent(int32_t x) {
    if (parent[x] == x) {
      return x;
    }
    parent[x] = find_parent(parent[x]);
    return parent[x];
  }
  void unite(int32_t x, int32_t y) {
    if (siz[x] < siz[y]) {
      parent[x] = y;
      siz[y] += siz[x];
    } else {
      parent[y] = x;
      siz[x] += siz[y];
    }
  }
};
Dsu dsu;
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int32_t m, n;
  std::cin >> m >> n;
  std::vector<int32_t> a(m), b(n);
  for (int32_t i = 0; i < m; i++) {
    std::cin >> a[i];
  }
  for (int32_t i = 0; i < n; i++) {
    std::cin >> b[i];
  }
  std::vector<Edge> edges;
  for (int32_t i = 0; i < m; i++) {
    int32_t k;
    std::cin >> k;
    for (int32_t j = 0; j < k; j++) {
      int32_t v;
      std::cin >> v;
      v--;
      edges.push_back(Edge(i, m + v, a[i] + b[v]));
    }
  }
  std::sort(edges.begin(), edges.end());
  dsu.init(n + m);
  int64_t ans = 0;
  for (auto &e : edges) {
    int32_t parU = dsu.find_parent(e.u);
    int32_t parV = dsu.find_parent(e.v);
    if (parU == parV) {
      ans += (int64_t)e.w;
    } else {
      dsu.unite(parU, parV);
    }
  }
  std::cout << ans << '\n';
}
