#include <bits/stdc++.h>
using namespace std;
const int N = 3000005;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
int f[2][N], a[N], b[N], tot, c[N], d[N], e[N], pre[N], cnt = 0;
pair<int, int> fro[2][N];
bool vis[2][N];
vector<int> ans1, s;
vector<pair<int, int> > ans2;
int main() {
  int n = read(), m1 = read(), m2 = read(), t = read();
  for (int i = 1; i <= m1; i++) {
    a[i] = read();
    s.push_back(a[i]);
    if (a[i] > 1) s.push_back(a[i] - 1);
    if (a[i] < n) s.push_back(a[i] + 1);
  }
  for (int i = 1; i <= m2; i++) {
    b[i] = read();
    s.push_back(b[i]);
    if (b[i] > 1) s.push_back(b[i] - 1);
    if (b[i] < n) s.push_back(b[i] + 1);
  }
  s.push_back(0);
  s.push_back(n);
  sort(s.begin(), s.end());
  s.erase(unique(s.begin(), s.end()), s.end());
  n = lower_bound(s.begin(), s.end(), n) - s.begin();
  for (int i = 1; i <= m1; i++)
    c[i] = lower_bound(s.begin(), s.end(), a[i]) - s.begin(), vis[0][c[i]] = 1;
  for (int i = 1; i <= m2; i++)
    d[i] = lower_bound(s.begin(), s.end(), b[i]) - s.begin(), vis[1][d[i]] = 1;
  memset(f, -1, sizeof(f));
  f[0][0] = f[1][0] = 0;
  for (int i = 1; i <= n; i++) {
    if (f[0][i - 1] != -1)
      f[0][i] = f[0][i - 1] + s[i] - s[i - 1], fro[0][i] = make_pair(i - 1, 0);
    if (f[1][i - 1] != -1)
      f[1][i] = f[1][i - 1] + s[i] - s[i - 1], fro[1][i] = make_pair(i - 1, 1);
    if (vis[0][i]) {
      f[0][i] = (f[0][i] - 1 >= t) ? f[0][i] - t : -1;
    }
    if (vis[1][i]) {
      f[1][i] = (f[1][i] - 1 >= t) ? f[1][i] - t : -1;
    }
    int a = f[0][i], b = f[1][i];
    if (min(b, t) > a && !vis[0][i]) {
      f[0][i] = min(b, t);
      fro[0][i] = make_pair(i, 1);
    }
    if (min(a, t) > b && !vis[1][i]) {
      f[1][i] = min(a, t);
      fro[1][i] = make_pair(i, 0);
    }
  }
  if (f[0][n] == -1 && f[1][n] == -1) {
    printf("No\n");
    return 0;
  }
  printf("Yes\n");
  int x = 0, y = n;
  if (f[0][n] == -1) x ^= 1;
  while (x || y) {
    if (vis[x][y]) ans2.push_back(make_pair(x, y - 1));
    int yx = x, yy = y;
    x = fro[yx][yy].second;
    y = fro[yx][yy].first;
    if (yy == y) ans1.push_back(y);
  }
  printf("%d\n", ans1.size());
  for (int i = ans1.size() - 1; i >= 0; i--) printf("%d ", s[ans1[i]]);
  printf("\n");
  printf("%d\n", ans2.size());
  int ls = 1 << 30;
  for (int i = 0; i < ans2.size(); i++) {
    ans2[i].second = ls = min(s[ans2[i].second], ls - t);
  }
  for (int i = ans2.size() - 1; i >= 0; i--)
    printf("%d %d\n", ans2[i].second, ans2[i].first + 1);
  return 0;
}
