#include <bits/stdc++.h>
using namespace std;
template <class C>
void mini(C &a4, C b4) {
  a4 = min(a4, b4);
}
template <class C>
void maxi(C &a4, C b4) {
  a4 = max(a4, b4);
}
template <class TH>
void _dbg(const char *sdbg, TH h) {
  cerr << sdbg << '=' << h << endl;
}
template <class TH, class... TA>
void _dbg(const char *sdbg, TH h, TA... a) {
  while (*sdbg != ',') cerr << *sdbg++;
  cerr << '=' << h << ',';
  _dbg(sdbg + 1, a...);
}
template <class T>
ostream &operator<<(ostream &os, vector<T> V) {
  os << "[";
  for (auto vv : V) os << vv << ",";
  return os << "]";
}
template <class L, class R>
ostream &operator<<(ostream &os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
const long long MaxDp = 3e6 + 100;
long long N, M1, M2, T;
vector<long long> Important;
long long MaxTime[MaxDp][2];
bool ChangeRow[MaxDp][2];
bool Locked[MaxDp][2];
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(11);
  if (0) cout << fixed << setprecision(6);
  cin >> N >> M1 >> M2 >> T;
  vector<vector<long long>> Obstacles(2);
  Obstacles[0].resize(M1);
  Obstacles[1].resize(M2);
  for (auto &V : Obstacles)
    for (long long &x : V) cin >> x;
  Important.reserve(3 * (M1 + M2) + 1);
  Important.push_back(0);
  auto addImportant = [&](long long x) {
    for (long long t : {x - 1, x, x + 1}) {
      if (((long long)(Important).size()) > 0 && Important.back() >= t) {
        continue;
      }
      Important.push_back(t);
    }
  };
  long long Lptr = 0, Rptr = 0;
  while (Lptr < M1 || Rptr < M2) {
    bool TakeLeft = Rptr == M2;
    if (Lptr < M1 && Rptr < M2)
      TakeLeft |= Obstacles[0][Lptr] < Obstacles[1][Rptr];
    if (TakeLeft)
      addImportant(Obstacles[0][Lptr++]);
    else
      addImportant(Obstacles[1][Rptr++]);
  }
  (Important);
  long long S = ((long long)(Important).size());
  const long long Infty = 2e9;
  MaxTime[0][0] = -T;
  MaxTime[0][1] = -T;
  ChangeRow[0][1] = true;
  Lptr = 0;
  Rptr = 0;
  for (long long i = 1; i < S; ++i) {
    long long x = Important[i];
    long long dx = x - Important[i - 1];
    bool LockedL = (Lptr < M1 && Obstacles[0][Lptr] == x);
    bool LockedR = (Rptr < M2 && Obstacles[1][Rptr] == x);
    if (LockedL) {
      ++Lptr;
    }
    if (LockedR) {
      ++Rptr;
    }
    Locked[i][0] = LockedL;
    Locked[i][1] = LockedR;
    (LockedL, LockedR);
    for (long long b : {0, 1}) {
      MaxTime[i][b] = MaxTime[i - 1][b] + dx;
      if (Locked[i][b]) {
        if (MaxTime[i][b] <= 0)
          MaxTime[i][b] = -Infty;
        else
          MaxTime[i][b] -= T;
      }
    }
    for (long long b : {0, 1}) {
      if (Locked[i][b]) {
        continue;
      }
      long long tt = MaxTime[i][b ^ 1];
      long long NewT = min<long long>(tt, 0);
      if (NewT > MaxTime[i][b]) {
        MaxTime[i][b] = NewT;
        ChangeRow[i][b] = true;
      }
    }
    (i, MaxTime[i][0], MaxTime[i][1]);
  }
  auto checkWin = [&](long long i, long long b) {
    if (MaxTime[i][b] < -T) {
      return;
    }
    cout << "Yes\n";
    vector<long long> Changes;
    vector<pair<long long, long long>> Shots;
    long long NumToShoot = 0;
    auto settleShots = [&]() {
      long long x = Important[i];
      long long AmountWait = -MaxTime[i][b];
      assert(AmountWait >= 0);
      long long FirstShot = x + AmountWait;
      while (NumToShoot > 0) {
        --NumToShoot;
        Shots.emplace_back(FirstShot + NumToShoot * T, b + 1);
      }
    };
    while (!(i == 0 && b == 0)) {
      if (ChangeRow[i][b]) {
        settleShots();
        Changes.push_back(Important[i]);
        b ^= 1;
        NumToShoot = Locked[i][b];
      } else {
        --i;
        NumToShoot += Locked[i][b];
      }
    }
    settleShots();
    cout << ((long long)(Changes).size()) << "\n";
    reverse((Changes).begin(), (Changes).end());
    for (long long v : Changes) {
      cout << v << " ";
    }
    cout << "\n";
    cout << ((long long)(Shots).size()) << "\n";
    reverse((Shots).begin(), (Shots).end());
    for (auto &P : Shots) cout << P.first << " " << P.second << "\n";
    exit(0);
  };
  checkWin(S - 1, 0);
  checkWin(S - 1, 1);
  cout << "No\n";
}
