#include <bits/stdc++.h>
using namespace std;
char getc() {
  char c = getchar();
  while ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c > '9'))
    c = getchar();
  return c;
}
int gcd(int n, int m) { return m == 0 ? n : gcd(m, n % m); }
int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  return x * f;
}
int n, m1, m2, t, a[2000010], b[2000010], v[2000010], pre[2000010][2],
    f[2000010][2], g[2000010][2], from[2000010][2][2], u, p[2000010],
    q[2000010][2];
bool flag[2000010][2];
signed main() {
  const char LL[] = "%lld\n";
  n = read(), m1 = read(), m2 = read(), t = read();
  for (int i = 1; i <= m1; i++) v[++u] = a[i] = read(), v[++u] = a[i] + 1;
  for (int i = 1; i <= m2; i++) v[++u] = b[i] = read(), v[++u] = b[i] + 1;
  v[++u] = 1;
  sort(v + 1, v + u + 1);
  u = unique(v + 1, v + u + 1) - v - 1;
  for (int i = 1; i <= m1; i++)
    flag[a[i] = lower_bound(v + 1, v + u + 1, a[i]) - v][0] = 1;
  for (int i = 1; i <= m2; i++)
    flag[b[i] = lower_bound(v + 1, v + u + 1, b[i]) - v][1] = 1;
  for (int i = 1; i <= u; i++) {
    f[i][0] = f[i][1] = g[i][0] = g[i][1] = 1010000000;
    if (flag[i - 1][0])
      pre[i][0] = i - 1;
    else
      pre[i][0] = pre[i - 1][0];
    if (flag[i - 1][1])
      pre[i][1] = i - 1;
    else
      pre[i][1] = pre[i - 1][1];
  }
  flag[0][0] = flag[0][1] = 1;
  f[0][0] = f[0][1] = t;
  g[0][0] = g[0][1] = 0;
  for (int i = 1; i <= u; i++) {
    int tmp[2] = {0, 1};
    if (flag[i][1]) swap(tmp[0], tmp[1]);
    for (int qwq = 0, j = tmp[qwq]; qwq < 2; qwq++, j = tmp[qwq])
      if (flag[i][j]) {
        int x = pre[i][j];
        g[i][j] = g[x][j] + t;
        if (g[i][j] >= v[i])
          g[i][j] = 1010000000;
        else {
          f[i][j] = max(0, t - (v[i] - g[i][j]));
          from[i][j][0] = x, from[i][j][1] = j;
        }
        x++;
        if (x != i && f[x][j] < v[i] - v[x] &&
            max(0, f[x][j] - v[i] + v[x] + t) <= f[i][j]) {
          f[i][j] = max(0, f[x][j] - v[i] + v[x] + t);
          g[i][j] = min(g[i][j], v[x] + f[x][j]);
          from[i][j][0] = x, from[i][j][1] = j;
        }
        f[i][j] = min(f[i][j], 1010000000);
      } else {
        int x = max(0, f[i - 1][j] - v[i] + v[i - 1]),
            y = flag[i][j ^ 1] ? f[i][j ^ 1]
                               : max(0, f[i - 1][j ^ 1] - v[i] + v[i - 1]);
        if (x <= y) {
          f[i][j] = x;
          from[i][j][0] = i - 1, from[i][j][1] = j;
        } else {
          f[i][j] = y;
          from[i][j][0] = i, from[i][j][1] = j ^ 1;
        }
        f[i][j] = min(f[i][j], 1010000000);
      }
  }
  if (min(f[u][0], f[u][1]) > n + 59) {
    cout << "No";
    return 0;
  } else {
    cout << "Yes" << endl;
    int x = u, y = 0;
    if (f[x][y] > n + 59) y ^= 1;
    int topp = 0, topq = 0;
    while (x) {
      if (from[x][y][1] != y) p[++topp] = from[x][y][0];
      if (flag[x][y]) q[++topq][0] = g[x][y], q[topq][1] = y + 1;
      int u = from[x][y][0], v = from[x][y][1];
      x = u, y = v;
    }
    if (y == 1) p[++topp] = 0;
    cout << topp << endl;
    for (int i = topp; i >= 1; i--) printf("%d ", v[p[i]]);
    cout << endl;
    cout << topq << endl;
    for (int i = topq; i >= 1; i--) printf("%d %d\n", q[i][0], q[i][1]);
  }
  return 0;
}
