#include <bits/stdc++.h>
using namespace std;
vector<int> road[101111];
vector<int> can[100111];
vector<int> hh;
vector<int> tt;
int have[101111];
struct nn {
  int q;
  int qq;
} qu[100111];
int res[101111];
int vv[100111];
bool cmp(nn a, nn b) {
  if (a.q != b.q) return a.q > b.q;
  return a.qq > b.qq;
}
int main() {
  int n, m, h, t;
  while (scanf("%d%d%d%d", &n, &m, &h, &t) > 0) {
    for (int i = 0; i < m; i++) {
      int a, b;
      scanf("%d%d", &a, &b);
      road[a].push_back(b);
      road[b].push_back(a);
      qu[i].q = a;
      qu[i].qq = b;
    }
    sort(qu, qu + m, cmp);
    int resu = 0, resv = 0;
    int cntt;
    for (int i = 0; i < m; i++) {
      int u = qu[i].q, v = qu[i].qq;
      if (!((road[u].size() >= h + 1 && road[v].size() >= t + 1) ||
            (road[v].size() >= h + 1 && road[u].size() >= t + 1)))
        continue;
      memset(have, 0, sizeof(have));
      ;
      memset(res, 0, sizeof(res));
      ;
      memset(vv, 0, sizeof(vv));
      ;
      cntt = 0;
      int cnt = 0;
      for (int j = 0; j < road[u].size(); j++) have[road[u][j]] = 1, cnt++;
      for (int j = 0; j < road[v].size(); j++)
        if (!have[road[v][j]])
          cnt++, have[road[v][j]] = 1;
        else
          res[++cntt] = road[v][j], vv[road[v][j]] = 1;
      if (cnt >= h + t + 2) {
        if (road[u].size() >= h + 1 && road[v].size() >= t + 1) {
          resu = u, resv = v;
          break;
        } else if (road[v].size() >= h + 1 && road[u].size() >= t + 1) {
          resu = v, resv = u;
          break;
        }
      }
    }
    if (resu == 0)
      puts("NO");
    else {
      puts("YES");
      printf("%d %d\n", resu, resv);
      int count = 0;
      for (int i = 0; i < road[resu].size(); i++)
        if (road[resu][i] != resv && vv[road[resu][i]] == 0 && count < h)
          printf("%d ", road[resu][i]), count++;
      int km = 1;
      for (; km <= cntt && count < h;) {
        printf("%d ", res[km]);
        count++;
        km++;
      }
      puts("");
      count = 0;
      for (int i = 0; i < road[resv].size(); i++)
        if (road[resv][i] != resu && count < t && vv[road[resv][i]] == 0)
          printf("%d ", road[resv][i]), count++;
      while (km <= cntt && count < t) {
        printf("%d ", res[km]);
        km++;
        count++;
      }
      puts("");
    }
  }
  return 0;
}
