#include <bits/stdc++.h>
const int MOD = 1e9 + 7;
using namespace std;
template <typename T>
T max1(T a, T b) {
  return a > b ? a : b;
}
template <typename T>
T min1(T a, T b) {
  return a < b ? a : b;
}
template <typename T>
T max1(T a, T b, T c) {
  return max1(a, max1(b, c));
}
template <typename T>
T min1(T a, T b, T c) {
  return min1(a, min1(b, c));
}
template <typename T>
T abs1(T a, T b) {
  return a > b ? a - b : b - a;
}
template <typename T>
void swap1(T &a, T &b) {
  T temp = b;
  b = a;
  a = temp;
}
template <typename T>
void swap1(T a[], int i, int j) {
  T temp = a[i];
  a[i] = a[j];
  a[j] = temp;
}
template <typename T, typename P>
void reset(T array[], int size, P value) {
  for (int i = 0; i < size; i++) array[i] = value;
}
template <typename T, typename P>
void reset(T *array, int rows, int cols, P value) {
  for (int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++) *(array + i * cols + j) = value;
}
template <typename T>
void resetClear(T v[], int size) {
  for (int i = 0; i < size; i++) v[i].clear();
}
template <typename T>
T maxArr(T array[], int start, int ending) {
  T res = array[start];
  for (int i = (start); i <= int(ending); i++) res = max1(array[i], res);
  return res;
}
template <typename T>
T maxArr(T array[], int ending) {
  T res = array[0];
  for (int i = 0; i < ending; i++) res = max1(array[i], res);
  return res;
}
template <typename T>
T minArr(T array[], int start, int ending) {
  T res = array[start];
  for (int i = (start); i <= int(ending); i++) res = min1(array[i], res);
  return res;
}
template <typename T>
T minArr(T array[], int ending) {
  T res = array[0];
  for (int i = 0; i < ending; i++) res = min1(array[i], res);
  return res;
}
template <typename T, typename P = long long int>
P sumArr(T array[], int ending) {
  P res = 0;
  for (int i = 0; i < ending; i++) res = res + array[i];
  return res;
}
template <typename T, typename P = long long int>
P sumArr(T array[], int ending, P mod) {
  P res = 0;
  for (int i = 0; i < ending; i++) res = (res + array[i]) % mod;
  return res;
}
int stringToNum(string &number) {
  int num = 0;
  int mul = 1;
  for (int i = ((int)(number.size())) - 1; i >= 0; --i) {
    num = num + (number[i] - '0') * mul;
    mul = mul * 10;
  }
  return num;
}
int bit(long long int num) {
  int res = 0;
  for (long long int i = 0; (1ll << i) <= num; ++i) res = i;
  return res;
}
const int MAXN = 100000 + 10;
const int MAXM = 100000 + 10;
const int MAXLOG = 18;
int m, n, k, x;
string s[MAXN];
long long int a[MAXN];
unordered_map<string, int> mapping;
std::vector<long long int> vec[MAXN];
bool cmp(long long int a1, long long int a2) { return a1 < a2; }
int main(int argc, char const *argv[]) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> k >> m;
  for (int i = 0; i < n; i++) cin >> s[i];
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < k; i++) {
    int x;
    cin >> x;
    for (int j = 0; j < x; j++) {
      int temp;
      cin >> temp;
      temp--;
      mapping[s[temp]] = i;
      vec[i].push_back(a[temp]);
    }
    sort(vec[i].begin(), vec[i].end(), cmp);
  }
  long long int cost = 0;
  for (int i = 0; i < m; i++) {
    string temp;
    cin >> temp;
    cost = cost + vec[mapping[temp]][0];
  }
  cout << cost << endl;
  return 0;
}
