#include <bits/stdc++.h>
using namespace std;
int N, M1, M2, T;
bool Cell[2][4000005];
vector<int> Area[2][1000005];
vector<pair<int, int> > V;
vector<pair<int, int> > Shoot;
vector<int> Change;
int DP[2][4000005];
int Val[4000005];
int Left[2][2000005], Right[2][2000005];
int Lim[2][2000005];
int area, cnt;
int Last[2][2000005];
int TT[2][4000005];
void Read() {
  scanf("%d%d%d%d", &N, &M2, &M1, &T);
  for (int i = 1; i <= M2; i++) {
    int x;
    scanf("%d", &x);
    V.push_back(make_pair(x, 1));
  }
  for (int i = 1; i <= M1; i++) {
    int x;
    scanf("%d", &x);
    V.push_back(make_pair(x, 0));
  }
  for (int i = 1; i <= M1 + M2; i++) {
    Left[0][i] = Left[1][i] = N + 5;
    Right[0][i] = Right[1][i] = -1;
  }
  sort(V.begin(), V.end());
}
void precalcArea() {
  int last = -1;
  Val[0] = -1;
  for (int k = 0; k < V.size(); k++) {
    int i = V[k].first, ind = V[k].second;
    int val = 0;
    if (i > last + 1) {
      ++cnt;
      Val[cnt] = Val[cnt - 1] + 1;
    }
    if (i != last) {
      ++cnt;
      Val[cnt] = i;
    }
    Cell[ind][cnt] = 1;
    last = i;
  }
  if (V.size() >= 1 && V.back().first == N) return;
  ++cnt;
  Val[cnt] = Val[cnt - 1] + 1;
}
void solveDP() {
  TT[0][1] = TT[1][1] = 1;
  for (int i = 2; i <= cnt; i++) {
    for (int j = 0; j <= 1; j++) {
      DP[j][i] = -1;
      int val = 0;
      if (Cell[j][i] == 1) val = T;
      if (DP[j][i - 1] >= 0 &&
          DP[j][i] < DP[j][i - 1] + Val[i] - Val[i - 1] - val) {
        DP[j][i] = DP[j][i - 1] + Val[i] - Val[i - 1] - val;
        TT[j][i] = j;
      }
      if (DP[j][i] == 0) DP[j][i] = -1;
    }
    for (int j = 0; j <= 1; j++) {
      int val = 0;
      if (Cell[j][i] == 1) continue;
      if (DP[1 - j][i] > 0 && min(DP[1 - j][i], T) > DP[j][i]) {
        DP[j][i] = min(DP[1 - j][i], T);
        TT[j][i] = 1 - j;
      }
    }
  }
}
void getSolution() {
  if (DP[0][cnt] == -1 && DP[1][cnt] == -1) {
    printf("No\n");
    return;
  }
  int start = 0;
  if (DP[0][cnt] == -1) start = 1;
  int nb = 0, last = -1;
  for (int i = cnt; i >= 1; i--) {
    int next = TT[start][i];
    last = start;
    if (Cell[start][i] == 1) ++nb;
    if (next == start) continue;
    Change.push_back(Val[i]);
    pair<int, int> f = make_pair(Val[i] - DP[start][i] + T, 2 - start);
    vector<pair<int, int> > Aux;
    for (int j = 1; j <= nb; j++) {
      Aux.push_back(f);
      f.first += T;
    }
    nb = 0;
    if (Cell[next][i] == 1) ++nb;
    reverse(Aux.begin(), Aux.end());
    for (int i = 0; i < Aux.size(); i++) Shoot.push_back(Aux[i]);
    start = next;
  }
  if (last == 1) {
    int i = 1;
    start = 1;
    pair<int, int> f = make_pair(Val[i] - DP[start][i] + T, 2 - start);
    vector<pair<int, int> > Aux;
    for (int j = 1; j <= nb; j++) {
      Aux.push_back(f);
      f.first += T;
    }
    reverse(Aux.begin(), Aux.end());
    for (int i = 0; i < Aux.size(); i++) Shoot.push_back(Aux[i]);
  }
  reverse(Shoot.begin(), Shoot.end());
  reverse(Change.begin(), Change.end());
  printf("Yes\n");
  int sz = Change.size();
  printf("%d\n", sz);
  for (int i = 0; i < sz; i++) printf("%d ", Change[i]);
  printf("\n");
  sz = Shoot.size();
  printf("%d\n", sz);
  for (int i = 0; i < sz; i++)
    printf("%d %d\n", Shoot[i].first, Shoot[i].second);
}
int main() {
  Read();
  precalcArea();
  solveDP();
  getSolution();
  return 0;
}
