#include <bits/stdc++.h>
using namespace std;
template <class T>
struct node {
  T val;
  T lazy;
  int l, r;
  node* left;
  node* right;
  node(int l, int r) {
    this->l = l;
    this->r = r;
    this->left = nullptr;
    this->right = nullptr;
  }
};
template <class T, int SZ>
struct segtree {
  T combIdentity = 1e17;
  T comb(T l, T r) { return min(l, r); }
  T pushIdentity = 0;
  void push(node<T>* n) {
    n->val += n->lazy;
    if (n->l != n->r) {
      n->left->lazy += n->lazy;
      n->right->lazy += n->lazy;
    }
    n->lazy = pushIdentity;
  }
  node<T>* root;
  segtree() {
    int ub = 1;
    while (ub < SZ) ub *= 2;
    root = new node<T>(0, ub - 1);
    root->val = pushIdentity;
    root->lazy = pushIdentity;
  }
  void propagate(node<T>* n) {
    if (n->l != n->r) {
      int mid = ((n->l) + (n->r)) / 2;
      if (n->left == nullptr) {
        n->left = new node<T>(n->l, mid);
        n->left->val = pushIdentity;
        n->left->lazy = pushIdentity;
      }
      if (n->right == nullptr) {
        n->right = new node<T>(mid + 1, n->r);
        n->right->val = pushIdentity;
        n->right->lazy = pushIdentity;
      }
    }
    push(n);
  }
  void updN(node<T>* n, int i1, int i2, T val) {
    propagate(n);
    if (i2 < n->l || i1 > n->r) return;
    if (i1 <= n->l && i2 >= n->r) {
      n->lazy = val;
      return;
    }
    updN(n->left, i1, i2, val);
    updN(n->right, i1, i2, val);
    n->val = comb(n->left->val, n->right->val);
  }
  void upd(int i1, int i2, T val) { updN(root, i1, i2, val); }
  T queryN(node<T>* n, int i1, int i2) {
    propagate(n);
    if (i2 < n->l || i1 > n->r) return combIdentity;
    if (n->l >= i1 && n->r <= i2) return n->val;
    T a = combIdentity;
    if (n->left != nullptr) a = comb(a, queryN(n->left, i1, i2));
    if (n->right != nullptr) a = comb(a, queryN(n->right, i1, i2));
    return a;
  }
  T query(int i1, int i2) { return queryN(root, i1, i2); }
};
const int MAX_N = 500500;
int n;
int arr[MAX_N];
long long cost[MAX_N];
int k;
int des[MAX_N];
map<int, int> desIdx;
segtree<long long, MAX_N> dp;
void setVal(int idx, long long val) {
  dp.upd(idx, idx, -dp.query(idx, idx) + val);
  assert(dp.query(idx, idx) == val);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) cin >> arr[i];
  for (int i = 0; i < n; i++) cin >> cost[i];
  cin >> k;
  for (int i = 0; i < k; i++) cin >> des[i];
  for (int i = 0; i < k; i++) desIdx[des[i]] = i + 1;
  dp.upd(0, k, 1e16);
  setVal(0, cost[0]);
  if (arr[0] == des[0]) setVal(desIdx[arr[0]], 0);
  for (int i = 1; i < n; i++) {
    if (arr[i] < des[0]) {
      dp.upd(1, k, min(cost[i], 0LL));
    } else if (desIdx.count(arr[i])) {
      int idx = desIdx[arr[i]];
      long long val = min(dp.query(idx - 1, idx - 1),
                          dp.query(idx, idx) + min(cost[i], 0LL));
      if (val <= 1e15) setVal(idx, val);
      if (1 <= idx - 1) dp.upd(1, idx - 1, cost[i]);
      if (idx + 1 <= k && cost[i] < 0) dp.upd(idx + 1, k, cost[i]);
    } else {
      auto it = desIdx.upper_bound(arr[i]);
      if (it == desIdx.end()) {
        dp.upd(1, k, cost[i]);
      } else {
        int idx = (*it).second;
        if (1 <= idx - 1) dp.upd(1, idx - 1, cost[i]);
        if (cost[i] < 0) dp.upd(idx, k, cost[i]);
      }
    }
    dp.upd(0, 0, cost[i]);
  }
  long long res = dp.query(k, k);
  if (abs(res) > (long long)MAX_N * 1e9) {
    return cout << "NO" << '\n', 0;
    ;
  }
  cout << "YES"
       << "\n";
  return cout << res << '\n', 0;
  ;
}
