#include <bits/stdc++.h>
clock_t __t = clock();
namespace my_std {
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template <typename T>
inline T rnd(T l, T r) {
  return uniform_int_distribution<T>(l, r)(rng);
}
template <typename T>
inline bool chkmax(T& x, T y) {
  return x < y ? x = y, 1 : 0;
}
template <typename T>
inline bool chkmin(T& x, T y) {
  return x > y ? x = y, 1 : 0;
}
template <typename T>
inline void read(T& t) {
  t = 0;
  char f = 0, ch = getchar();
  double d = 0.1;
  while (ch > '9' || ch < '0') f |= (ch == '-'), ch = getchar();
  while (ch <= '9' && ch >= '0') t = t * 10 + ch - 48, ch = getchar();
  if (ch == '.') {
    ch = getchar();
    while (ch <= '9' && ch >= '0') t += d * (ch ^ 48), d *= 0.1, ch = getchar();
  }
  t = (f ? -t : t);
}
template <typename T, typename... Args>
inline void read(T& t, Args&... args) {
  read(t);
  read(args...);
}
char __sr[1 << 21], __z[20];
int __C = -1, __zz = 0;
inline void Ot() { fwrite(__sr, 1, __C + 1, stdout), __C = -1; }
inline void print(register int x) {
  if (__C > 1 << 20) Ot();
  if (x < 0) __sr[++__C] = '-', x = -x;
  while (__z[++__zz] = x % 10 + 48, x /= 10)
    ;
  while (__sr[++__C] = __z[__zz], --__zz)
    ;
  __sr[++__C] = '\n';
}
void file() {}
inline void chktime() {}
long long ksm(long long x, int y) {
  long long ret = 1;
  for (; y; y >>= 1, x = x * x)
    if (y & 1) ret = ret * x;
  return ret;
}
}  // namespace my_std
using namespace my_std;
int n, T, m[2];
int x[2][2010101], X[2010101], K;
int dp[2][2010101], fr[2][2010101];
map<int, int> vis[2];
int ans1[2010101], c1;
int ans2[2010101], c2;
int main() {
  file();
  read(n, m[0], m[1], T);
  for (int i = (1); i <= (m[0]); i++)
    read(x[0][i]), vis[0][x[0][i]] = 1, X[++K] = x[0][i], X[++K] = x[0][i] + 1;
  for (int i = (1); i <= (m[1]); i++)
    read(x[1][i]), vis[1][x[1][i]] = 1, X[++K] = x[1][i], X[++K] = x[1][i] + 1;
  X[++K] = n + 1;
  X[++K] = 0;
  sort(X + 1, X + K + 1);
  K = unique(X + 1, X + K + 1) - X - 1;
  fr[1][1] = 1 << 1 | 0;
  for (int i = (2); i <= (K); i++) {
    for (int k = (0); k <= (1); k++) dp[k][i] = -1e9;
    for (int k = (0); k <= (1); k++) {
      int w = dp[k][i - 1] + X[i] - X[i - 1] - 1;
      if (!vis[k][X[i]])
        dp[k][i] = w + 1, fr[k][i] = (i - 1) << 1 | k;
      else if (w >= T)
        dp[k][i] = w - T + 1, fr[k][i] = (i - 1) << 1 | k;
    }
    for (int k = (0); k <= (1); k++)
      if (!vis[k][X[i]] && chkmax(dp[k][i], min(dp[k ^ 1][i], T)))
        fr[k][i] = i << 1 | (k ^ 1);
  }
  if (dp[0][K] < 0 && dp[1][K] < 0) return puts("No"), 0;
  int x = 0, y = K;
  if (dp[x][y] < 0) x ^= 1;
  while (x != 0 || y != 1) {
    if ((fr[x][y] & 1) != x) ans1[++c1] = X[y];
    if (vis[x][X[y]]) ans2[++c2] = (X[y] - dp[x][y]) << 1 | x;
    int p = fr[x][y];
    x = p & 1, y = p >> 1;
  }
  puts("Yes");
  printf("%d\n", c1);
  for (int i = (c1); i >= (1); i--) printf("%d%c", ans1[i], " \n"[i == 1]);
  printf("%d\n", c2);
  for (int i = (c2); i >= (1); i--)
    printf("%d %d\n", ans2[i] >> 1, (ans2[i] & 1) + 1);
  return 0;
}
