#include <bits/stdc++.h>
using namespace std;
int n, m, s;
int comp[100100], level[100100], cost[100100];
int tree[100100 * 17 * 2], ordproblems[100100];
int treeind[100100 * 17 * 2];
int ordstudents[100100];
int res[100100];
int tmpres[100100];
void init() {
  scanf("%d %d %d", &n, &m, &s);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &comp[i]);
  }
  for (int i = 1; i <= n; i++) scanf(" %d ", &level[i]);
  for (int i = 1; i <= n; i++) scanf(" %d ", &cost[i]);
}
void buildtree(int root, int l, int r) {
  if (l == r) {
    tree[root] = cost[ordstudents[l]];
    treeind[root] = l;
  } else {
    int mid = (l + r) / 2;
    buildtree(2 * root, l, mid);
    buildtree(2 * root + 1, mid + 1, r);
    if (tree[2 * root] < tree[2 * root + 1]) {
      tree[root] = tree[2 * root];
      treeind[root] = treeind[2 * root];
    } else {
      tree[root] = tree[2 * root + 1];
      treeind[root] = treeind[2 * root + 1];
    }
  }
}
bool cmp(int a, int b) { return comp[a] < comp[b]; }
int cmp2(int a, int b) { return level[a] < level[b]; }
void updatetreecell(int cell) {
  if (tree[2 * cell] == -1 && tree[2 * cell + 1] == -1) {
    tree[cell] = treeind[cell] = -1;
  } else if (tree[2 * cell] == -1) {
    tree[cell] = tree[2 * cell + 1];
    treeind[cell] = treeind[2 * cell + 1];
  } else if (tree[2 * cell + 1] == -1) {
    tree[cell] = tree[2 * cell];
    treeind[cell] = treeind[2 * cell];
  } else if (tree[2 * cell] < tree[2 * cell + 1]) {
    tree[cell] = tree[2 * cell];
    treeind[cell] = treeind[2 * cell];
  } else {
    tree[cell] = tree[2 * cell + 1];
    treeind[cell] = treeind[2 * cell + 1];
  }
}
void deletequery(int root, int l, int r, int todelete) {
  if (l == r) {
    tree[root] = -1;
    treeind[root] = -1;
  } else {
    int mid = (l + r) / 2;
    if (todelete <= mid) {
      deletequery(2 * root, l, mid, todelete);
    } else {
      deletequery(2 * root + 1, mid + 1, r, todelete);
    }
    updatetreecell(root);
  }
}
int query(int root, int l, int r, int complex) {
  if (level[ordstudents[r]] < complex)
    return -1;
  else {
    if (level[ordstudents[l]] >= complex)
      return treeind[root];
    else {
      int mid = (l + r) / 2;
      int res1 = query(2 * root, l, mid, complex);
      int res2 = query(2 * root + 1, mid + 1, r, complex);
      if (res1 == -1 && res2 == -1)
        return -1;
      else if (res1 == -1)
        return res2;
      else if (res2 == -1)
        return res1;
      else if (cost[ordstudents[res1]] < cost[ordstudents[res2]])
        return res1;
      else
        return res2;
    }
  }
}
void solve() {
  int l = 1;
  int r = m;
  for (int i = 1; i <= m; i++) ordproblems[i] = i;
  sort(ordproblems + 1, ordproblems + m + 1, cmp);
  for (int i = 1; i <= n; i++) ordstudents[i] = i;
  sort(ordstudents + 1, ordstudents + n + 1, cmp2);
  int wassol = false;
  while (l <= r) {
    int mid = (l + r) / 2;
    buildtree(1, 1, n);
    int totalcost = 0;
    bool bad = false;
    for (int i = m; i >= 1; i -= mid) {
      int st = query(1, 1, n, comp[ordproblems[i]]);
      if (st == -1) {
        bad = true;
        break;
      } else {
        totalcost += cost[ordstudents[st]];
        for (int j = i; j >= 1 && j > i - mid; j--) {
          tmpres[ordproblems[j]] = ordstudents[st];
        }
      }
      if (totalcost > s) {
        bad = true;
        break;
      }
      deletequery(1, 1, n, st);
    }
    if (bad) {
      l = mid + 1;
      continue;
    } else
      r = mid - 1;
    wassol = true;
    r = mid - 1;
    for (int i = 1; i <= m; i++) res[i] = tmpres[i];
  }
  if (wassol) {
    printf("YES\n");
    for (int i = 1; i <= m; i++) printf("%d ", res[i]);
  } else {
    printf("NO\n");
  }
}
int main() {
  init();
  solve();
  return 0;
}
