#include <bits/stdc++.h>
using namespace std;
const int N = 2000005;
using ll = long long;
vector<int> ans1;
vector<pair<int, int>> ans2;
bool ok[2][N];
int n, m1, m2, t, d[N], ptr, dp[2][N], lst[2][N], num, x1[N], x2[N];
inline void upd(int x, int y, int v, int op) {
  if (dp[x][y] < v) dp[x][y] = v, lst[x][y] = op;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m1 >> m2 >> t;
  for (int i = 1; i <= m1; i++) {
    cin >> x1[i];
    d[++num] = x1[i];
    d[++num] = x1[i] + 1;
  }
  for (int i = 1; i <= m2; i++) {
    cin >> x2[i];
    d[++num] = x2[i];
    d[++num] = x2[i] + 1;
  }
  d[++num] = 0;
  d[++num] = n + 1;
  sort(d + 1, d + num + 1);
  num = unique(d + 1, d + num + 1) - d - 1;
  for (int i = 1; i <= m1; i++)
    ok[0][lower_bound(d + 1, d + num + 1, x1[i]) - d] = 1;
  for (int i = 1; i <= m2; i++)
    ok[1][lower_bound(d + 1, d + num + 1, x2[i]) - d] = 1;
  memset(dp, -1, sizeof(dp));
  dp[0][1] = dp[1][1] = 0;
  lst[1][1] = 1;
  for (int i = 1; i <= num; i++) {
    for (int j = 0; j < 2; j++)
      if (dp[j][i] != -1 && !ok[j ^ 1][i]) upd(j ^ 1, i, min(dp[j][i], t), 1);
    for (int j = 0; j < 2; j++)
      if (dp[j][i] != -1 && dp[j][i] + d[i + 1] - d[i] - 1 >= t * ok[j][i + 1])
        upd(j, i + 1, dp[j][i] + d[i + 1] - d[i] - t * ok[j][i + 1], 0);
  }
  int ansx = dp[0][num] < dp[1][num];
  if (dp[ansx][num] == -1) {
    cout << "No" << endl;
    return 0;
  }
  int ansy = num;
  int lv = INT_MAX;
  while (ansx || (ansy != 1)) {
    if (lst[ansx][ansy])
      ans1.push_back(d[ansy]), ansx ^= 1;
    else {
      if (ok[ansx][ansy])
        lv = min(lv - t, d[ansy] - 1), ans2.push_back({lv, ansx});
      --ansy;
    }
  }
  cout << "Yes" << endl;
  cout << ans1.size() << '\n';
  for (int i = ans1.size() - 1; i >= 0; --i) cout << ans1[i] << ' ';
  cout << '\n' << ans2.size() << endl;
  for (int i = ans2.size() - 1; i >= 0; --i)
    cout << ans2[i].first << ' ' << ans2[i].second + 1 << '\n';
  return 0;
}
