#include <bits/stdc++.h>
using namespace std;
const int N = 2000100;
const int inf = 1000000007;
int dp[N][2], n, m[2], t, tot = 0, g[N][2], path[N], ans[N];
struct nd {
  int d, id;
} a[N][2];
struct element {
  int d, id[2];
} b[N];
struct point {
  int x, y;
} po[N];
inline int read() {
  int x = 0;
  char ch = getchar();
  while ((ch < '0') || (ch > '9')) ch = getchar();
  while ((ch >= '0') && (ch <= '9')) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x;
}
void calc(int i, int j) {
  if (dp[i - 1][j] == -1) {
    g[i][j] = -1;
    return;
  }
  if (!b[i].id[j])
    g[i][j] = dp[i - 1][j] + b[i].d - b[i - 1].d;
  else if (dp[i - 1][j] + b[i].d - b[i - 1].d <= t)
    g[i][j] = -1;
  else
    g[i][j] = dp[i - 1][j] + b[i].d - b[i - 1].d - t;
}
void upd(int i, int j) {
  dp[i][j] = g[i][j];
  if (!b[i].id[j]) dp[i][j] = max(dp[i][j], min(g[i][j ^ 1], t));
}
int main() {
  int i, j, k, nw, x, len[2], p[2], tmp, st;
  scanf("%d%d%d%d", &n, &m[0], &m[1], &t);
  if (m[0] + m[1] == 0) {
    printf("Yes\n0\n\n0\n\n");
    return 0;
  }
  for (i = 0; i <= 1; i++) {
    len[i] = 0;
    for (j = 1; j <= m[i]; j++) {
      x = read();
      if (a[len[i]][i].d == x)
        a[len[i]][i].id = 1;
      else
        a[++len[i]][i] = (nd){x, 1};
      a[++len[i]][i] = (nd){x + 1, 0};
    }
    a[len[i] + 1][i] = (nd){inf, 0};
  }
  tot = 0;
  memset(b, 0, sizeof(b));
  for (p[0] = p[1] = 1; ((p[0] <= len[0]) || (p[1] <= len[1]));) {
    if (a[p[0]][0].d <= a[p[1]][1].d)
      nw = 0;
    else
      nw = 1;
    if (b[tot].d != a[p[nw]][nw].d) b[++tot].d = a[p[nw]][nw].d;
    b[tot].id[nw] = a[p[nw]][nw].id;
    p[nw]++;
  }
  dp[0][0] = dp[0][1] = 0;
  for (i = 1; i <= tot; i++) {
    for (j = 0; j <= 1; j++) calc(i, j);
    for (j = 0; j <= 1; j++) upd(i, j);
  }
  if ((dp[tot][0] == -1) && (dp[tot][1] == -1))
    printf("No\n");
  else {
    printf("Yes\n");
    if (g[tot][0] != -1)
      path[tot] = 0;
    else
      path[tot] = 1;
    for (i = tot - 1; i; i--)
      if ((g[i][path[i + 1]] != -1) &&
          (b[i + 1].d - b[i].d + g[i][path[i + 1]] -
               b[i + 1].id[path[i + 1]] * t ==
           g[i + 1][path[i + 1]]))
        path[i] = path[i + 1];
      else
        path[i] = path[i + 1] ^ 1;
    ans[0] = 0;
    for (i = 1; i <= tot; i++)
      if (path[i - 1] ^ path[i]) ans[++ans[0]] = b[i - 1].d;
    printf("%d\n", ans[0]);
    for (i = 1; i <= ans[0]; i++) printf("%d ", ans[i]);
    printf("\n");
    ans[0] = 0;
    for (i = 1; i <= tot; i = j + 1) {
      j = i;
      while ((j <= tot) && (path[j + 1] == path[i])) j++;
      tmp = 0;
      for (k = i; k <= j; k++) tmp += b[k].id[path[i]];
      st = b[i - 1].d + t - dp[i - 1][path[i]];
      for (k = 1; k <= tmp; k++, st += t)
        po[++ans[0]] = (point){st, path[i] + 1};
    }
    printf("%d\n", ans[0]);
    for (i = 1; i <= ans[0]; i++) printf("%d %d\n", po[i].x, po[i].y);
  }
  return 0;
}
