#include <bits/stdc++.h>   using namespace std;   int n, t, m[2];   const int N = 2100000;   const int inf = 1e9 + 7;   int a[2][N], x[N];   int dp[2][N];   bool b[2][N], pr[2][N];   set<int> H[2];   int main() {     cin >> n >> m[0] >> m[1] >> t;     int xn = 0;     x[xn++] = 0;     for (int j = 0; j < 2; j++) {       for (int i = 0; i < m[j]; i++) {         scanf( %d , &a[j][i]);         H[j].insert(a[j][i]);         x[xn++] = a[j][i] + 1;       }     }     if (a[0][0] == 1 && a[1][0] == 1) return puts( No ), 0;     x[xn++] = n + 1;     sort(x, x + xn);     xn = unique(x, x + xn) - x;     for (int j = 0; j < 2; j++) {       for (int i = 0; i < m[j]; i++)         b[j][lower_bound(x, x + xn, a[j][i] + 1) - x] = 1;     }     for (int i = 1; i < xn; i++) {       dp[0][i] = dp[1][i] = inf;       for (int j = 0; j < 2; j++)         if (dp[j][i - 1] != inf) {           if (b[j][i]) {             int y = x[i] - 1;             int cur = (x[i - 1] == y ? dp[j][i - 1] : dp[j][i - 1] + t);             if (cur < y) {               if (H[j].count(x[i])) {                 if (cur + t <= y) {                   dp[j][i] = min(dp[j][i], cur + t);                 }               } else {                 dp[j][i] = min(dp[j][i], cur);               }             }           } else if (H[j].count(x[i])) {             int y = x[i];             if (dp[j][i - 1] + t < y) {               dp[j][i] = min(dp[j][i], dp[j][i - 1] + t);             }           } else {             dp[j][i] = dp[j][i - 1];           }         }       for (int j = 0; j < 2; j++) {         if (dp[j][i] < inf) {           if (H[!j].count(x[i])) {             continue;           }           if (dp[!j][i] > max(dp[j][i], x[i] - t)) {             dp[!j][i] = max(dp[j][i], x[i] - t);             pr[!j][i] = 1;           }         }       }     }     if (dp[0][xn - 1] == inf && dp[1][xn - 1] == inf) return puts( No ), 0;     puts( Yes );     int state = 0, pos = xn - 1;     if (dp[1][xn - 1] < inf) state = 1;     vector<pair<int, int> > ans;     vector<int> changes;     while (pos != 0) {       ans.push_back(make_pair(state, pos));       int flg = pr[state][pos];       if (flg) {         changes.push_back(x[pos]);         state ^= 1;       } else {         pos--;       }     }     ans.push_back(make_pair(state, 0));     if (state == 1) {       state ^= 1;       ans.push_back(make_pair(state, 0));       changes.push_back(0);     }     printf( %d n , changes.size());     reverse(changes.begin(), changes.end());     reverse(ans.begin(), ans.end());     for (int y : changes) printf( %d  , y);     puts(  );     int last = t;     vector<pair<int, int> > ret;     for (pair<int, int> cur : ans) {       if (cur.first != state) {         last = max(last, x[cur.second]);       }       if (b[cur.first][cur.second]) {         if (state == cur.first)           ret.push_back(make_pair(cur.first + 1, last)), last += t;       }       if (H[cur.first].count(x[cur.second])) {         if (state == cur.first) {           b[cur.first][cur.second + 1] = 0;           ret.push_back(make_pair(cur.first + 1, last)), last += t;         }       }       state = cur.first;     }     printf( %d n , ret.size());     for (pair<int, int> cur : ret) printf( %d %d n , cur.second, cur.first);     return 0;   }