#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const unsigned gen_seed =
    std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937_64 gen(gen_seed);
class Action {
 public:
  int tp = -1;
  int shoot;
  int dx;
  Action(int tp, int shoot, int dx) : tp(tp), shoot(shoot), dx(dx){};
  Action(){};
};
std::vector<int> pos;
int to(int x) {
  return lower_bound((pos).begin(), (pos).end(), x) - pos.begin();
}
int main() {
  int n, m1, m2, t;
  scanf("%d %d %d %d", &n, &m1, &m2, &t);
  set<int> c;
  c.insert(0);
  std::vector<int> v1(m1);
  for (int i = 0; i < m1; i++) scanf("%d", &v1[i]);
  std::vector<int> v2(m2);
  for (int i = 0; i < m2; i++) scanf("%d", &v2[i]);
  sort((v1).begin(), (v1).end());
  sort((v2).begin(), (v2).end());
  for (auto x : v1) c.insert(x);
  for (auto x : v2) c.insert(x);
  for (auto x : v1) c.insert(x + 1);
  for (auto x : v2) c.insert(x + 1);
  c.insert(n + 1);
  int pt = 0;
  for (auto x : c) pos.push_back(x), pt++;
  const int inf = 1e9 + 1000;
  std::vector<int> b1(pt, -inf);
  std::vector<int> b2(pt, -inf);
  std::vector<int> vtp(pt, 0);
  for (auto x : v1) vtp[to(x)] += 1;
  for (auto x : v2) vtp[to(x)] += 2;
  vector<Action> p1(pt);
  vector<Action> p2(pt);
  b1[0] = -t;
  b2[0] = -t;
  p2[0] = Action(0, 0, 0);
  for (int i = 0; i < pt - 1; i++) {
    int x = pos[i];
    if ((vtp[i] & 1) == 0 && b1[i] < b2[i] && b1[i] < 0) {
      b1[i] = min(b2[i], 0);
      p1[i] = Action(0, 0, 0);
    }
    if ((vtp[i] & 2) == 0 && b2[i] < b1[i] && b2[i] < 0) {
      b2[i] = min(b1[i], 0);
      p2[i] = Action(0, 0, 0);
    }
    auto itn1 = upper_bound((v1).begin(), (v1).end(), x);
    auto itn2 = upper_bound((v2).begin(), (v2).end(), x);
    if (itn1 != v1.end() && b1[i] != -inf) {
      int nw1 = *itn1;
      int i1 = to(nw1);
      int d = nw1 - x;
      if (b1[i] + d - 1 >= 0 && b1[i1] < b1[i] + d - t) {
        b1[i1] = b1[i] + d - t;
        p1[i1] = Action(1, x - b1[i], x);
      }
    }
    if (itn2 != v2.end() && b2[i] != -inf) {
      int nw2 = *itn2;
      int i2 = to(nw2);
      int d = nw2 - x;
      if (b2[i] + d - 1 >= 0 && b2[i2] < b2[i] + d - t) {
        b2[i2] = b2[i] + d - t;
        p2[i2] = Action(1, x - b2[i], x);
      }
    }
    int nx = pos[i + 1];
    if (b1[i] != -inf && (vtp[i + 1] & 1) == 0 && b1[i + 1] < b1[i] + nx - x) {
      b1[i + 1] = b1[i] + nx - x;
      p1[i + 1] = Action(2, 0, x);
    }
    if (b2[i] != -inf && (vtp[i + 1] & 2) == 0 && b2[i + 1] < b2[i] + nx - x) {
      b2[i + 1] = b2[i] + nx - x;
      p2[i + 1] = Action(2, 0, x);
    }
  }
  int curx = n + 1;
  int cury = 1;
  if (b1[pt - 1] == -inf && b2[pt - 1] == -inf) {
    cout << "No";
    return 0;
  }
  if (b1[pt - 1] == -inf) cury = 2;
  std::vector<int> moves;
  std::vector<std::pair<int, int> > shoot;
  while (curx != 0 || cury != 1) {
    int ind = to(curx);
    if (cury == 1) {
      if (p1[ind].tp == 2)
        curx = p1[ind].dx;
      else if (p1[ind].tp == 0) {
        moves.push_back(curx);
        cury = 2;
      } else {
        shoot.push_back(make_pair(p1[ind].shoot, 1));
        curx = p1[ind].dx;
      }
    } else if (cury == 2) {
      if (p2[ind].tp == 2)
        curx = p2[ind].dx;
      else if (p2[ind].tp == 0) {
        moves.push_back(curx);
        cury = 1;
      } else {
        shoot.push_back(make_pair(p2[ind].shoot, 2));
        curx = p2[ind].dx;
      }
    }
  }
  reverse((moves).begin(), (moves).end());
  reverse((shoot).begin(), (shoot).end());
  printf("Yes\n");
  printf("%d\n", (int)moves.size());
  for (auto x : moves) printf("%d ", x);
  printf("\n");
  printf("%d\n", (int)shoot.size());
  for (auto x : shoot) printf("%d %d\n", x.first, x.second);
  printf("\n");
}
