#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const long long infinity = 1000000000000000000;
const int inf = 1e9 + 5;
bool do_debug = false;
template <typename T>
ostream& operator<<(ostream& os, vector<T>& v) {
  for (auto element : v) {
    os << element << " ";
  }
  return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, pair<T, S>& p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, set<T>& v) {
  if (v.size() == 0) {
    os << "empty set\n";
    return os;
  }
  auto endit = v.end();
  endit--;
  os << "[";
  for (auto it = v.begin(); it != v.end(); it++) {
    os << *it;
    if (it != endit) {
      os << ", ";
    }
  }
  os << "]";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, multiset<T>& v) {
  if (v.size() == 0) {
    os << "empty multiset\n";
    return os;
  }
  auto endit = v.end();
  endit--;
  os << "[";
  for (auto it = v.begin(); it != v.end(); it++) {
    os << *it;
    if (it != endit) {
      os << ", ";
    }
  }
  os << "]";
  return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, map<T, S>& v) {
  if (v.size() == 0) {
    os << "empty map\n";
    return os;
  }
  auto endit = v.end();
  endit--;
  os << "{";
  for (auto it = v.begin(); it != v.end(); it++) {
    os << "(" << (*it).first << " : " << (*it).second << ")";
    if (it != endit) {
      os << ", ";
    }
  }
  os << "}";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, vector<vector<T>>& v) {
  for (auto& subv : v) {
    for (auto& e : subv) {
      os << e << " ";
    }
    os << "\n";
  }
  return os;
}
pair<long long, long long> task(pair<long long, long long> child1,
                                pair<long long, long long> child2) {
  return child1.first <= child2.first ? child1 : child2;
}
void update(vector<pair<long long, long long>>& segment_tree, int node, int l,
            int r, int pos, long long val) {
  if (l == r) {
    segment_tree[node].first = val;
  } else {
    int mid = (l + r) >> 1;
    if (pos <= mid) {
      update(segment_tree, node << 1, l, mid, pos, val);
    } else {
      update(segment_tree, (node << 1) + 1, mid + 1, r, pos, val);
    }
    segment_tree[node] =
        task(segment_tree[node << 1], segment_tree[(node << 1) + 1]);
  }
}
pair<long long, long long> query(
    vector<pair<long long, long long>>& segment_tree, int node, int l, int r,
    int lq, int rq) {
  if (lq > rq) {
    return make_pair(infinity, infinity);
  } else if (lq <= l && rq >= r) {
    return segment_tree[node];
  } else {
    int mid = (l + r) >> 1;
    return task(
        query(segment_tree, node << 1, l, mid, lq, min(rq, mid)),
        query(segment_tree, (node << 1) + 1, mid + 1, r, max(lq, mid + 1), rq));
  }
}
void build(vector<pair<long long, long long>>& segment_tree,
           vector<pair<pair<long long, long long>, long long>>& v, int node,
           int l, int r) {
  if (l == r) {
    segment_tree[node].first = v[l].first.second;
    segment_tree[node].second = l;
  } else {
    int mid = (l + r) >> 1;
    build(segment_tree, v, node << 1, l, mid);
    build(segment_tree, v, (node << 1) + 1, mid + 1, r);
    segment_tree[node] =
        task(segment_tree[node << 1], segment_tree[(node << 1) + 1]);
  }
}
long long n_students, n_bugs;
long long maxcost;
vector<pair<long long, long long>> complexities;
vector<pair<pair<long long, long long>, long long>> v;
vector<long long> ans;
vector<pair<long long, long long>> tree;
void solve() {
  cin >> n_students >> n_bugs >> maxcost;
  complexities.resize(n_bugs);
  v.resize(n_students);
  ans.resize(n_bugs);
  tree.resize(n_students << 2);
  for (int i = 0; i < n_bugs; i++) {
    cin >> complexities[i].first;
    complexities[i].second = i;
  }
  for (int i = 0; i < n_students; i++) {
    cin >> v[i].first.first;
    v[i].second = i + 1;
  }
  for (int i = 0; i < n_students; i++) {
    cin >> v[i].first.second;
  }
  sort(complexities.begin(), complexities.end());
  reverse(complexities.begin(), complexities.end());
  sort(v.begin(), v.end());
  build(tree, v, 1, 0, n_students - 1);
  vector<long long> aux(n_students);
  for (int i = 0; i < n_students; i++) {
    aux[i] = v[i].first.first;
  }
  long long optimal_days = n_bugs + 5;
  long long l = 1, r = n_bugs;
  while (l <= r) {
    long long mid = ((r - l) >> 1) + l;
    vector<pair<long long, long long>> changes;
    int ptr = 0;
    long long tcost = 0;
    while (ptr < n_bugs) {
      int ind = lower_bound(aux.begin(), aux.end(), complexities[ptr].first) -
                aux.begin();
      pair<long long, long long> p =
          query(tree, 1, 0, n_students - 1, ind, n_students - 1);
      if (p.first == infinity) {
        tcost = infinity;
        break;
      }
      tcost += p.first;
      changes.push_back(make_pair(p.second, p.first));
      update(tree, 1, 0, n_students - 1, p.second, infinity);
      ptr += mid;
    }
    if (tcost <= maxcost) {
      optimal_days = min(optimal_days, mid);
      r = mid - 1;
    } else {
      l = mid + 1;
    }
    for (pair<long long, long long> change : changes) {
      update(tree, 1, 0, n_students - 1, change.first, change.second);
    }
  }
  if (optimal_days > n_bugs) {
    cout << "NO\n";
  } else {
    cout << "YES\n";
    long long ptr = 0;
    while (ptr < n_bugs) {
      int ind = lower_bound(aux.begin(), aux.end(), complexities[ptr].first) -
                aux.begin();
      pair<long long, long long> p =
          query(tree, 1, 0, n_students - 1, ind, n_students - 1);
      update(tree, 1, 0, n_students - 1, p.second, infinity);
      for (long long i = ptr; i < min(ptr + optimal_days, n_bugs); i++) {
        ans[complexities[i].second] = v[p.second].second;
      }
      ptr += optimal_days;
    }
    cout << ans << "\n";
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int q = 1;
  while (q-- > 0) {
    solve();
  }
  return 0;
}
