#include <bits/stdc++.h>
using namespace std;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
bool isone(long long, int);
int count(long long);
long long exp(long long, long long, long long);
long long GCD(long long, long long);
int a[200010][2];
vector<int> adj[200010];
vector<int> uv, vv, cv;
int vis[200010];
int main() {
  int n, m, h, t;
  scanf("%d%d%d%d", &n, &m, &h, &t);
  for (int i = 0; i < m; i++) {
    int n1, n2;
    scanf("%d%d", &n1, &n2);
    adj[n1].push_back(n2);
    adj[n2].push_back(n1);
    a[2 * i][0] = n1;
    a[2 * i][1] = n2;
    a[2 * i + 1][0] = n2;
    a[2 * i + 1][1] = n1;
  }
  for (int i = 0; i <= n; i++) sort(adj[i].begin(), adj[i].end());
  for (int i = 0; i < 2 * m; i++) {
    uv.clear();
    vv.clear();
    cv.clear();
    int u = a[i][0];
    int v = a[i][1];
    int common = 0, un = 0, vn = 0;
    int st1 = 0, st2 = 0;
    while ((st1 < adj[u].size()) && (st2 < adj[v].size())) {
      if (adj[u][st1] == v) {
        st1++;
        continue;
      }
      if (adj[v][st2] == u) {
        st2++;
        continue;
      }
      if (((common + un) > (h + t)) && ((common + vn)) > (h + t)) break;
      if ((common + un) > (h + t)) {
        vn++;
        vv.push_back(adj[v][st2]);
        st2++;
      } else if ((common + vn) > (h + t)) {
        un++;
        uv.push_back(adj[u][st1]);
        st1++;
      } else {
        if (adj[u][st1] == adj[v][st2]) {
          common++;
          cv.push_back(adj[u][st1]);
          st1++;
          st2++;
        } else if (adj[u][st1] < adj[v][st2]) {
          un++;
          uv.push_back(adj[u][st1]);
          st1++;
        } else {
          vn++;
          vv.push_back(adj[v][st2]);
          st2++;
        }
      }
    }
    while (st1 < adj[u].size()) {
      if ((common + un) > (h + t)) break;
      if (adj[u][st1] == v) {
        st1++;
        continue;
      }
      un++;
      uv.push_back(adj[u][st1]);
      st1++;
    }
    while (st2 < adj[v].size()) {
      if ((common + vn) > (h + t)) break;
      if (adj[v][st2] == u) {
        st2++;
        continue;
      }
      vn++;
      vv.push_back(adj[v][st2]);
      st2++;
    }
    common -= (max(0, h - un));
    common -= (max(0, t - vn));
    if (common >= 0) {
      printf("YES\n");
      printf("%d %d\n", u, v);
      for (int j = 0; j < min((int)uv.size(), h); j++) printf("%d ", uv[j]);
      int st = 0;
      if (uv.size() < h) {
        for (; st < (h - (int)uv.size()); st++) printf("%d ", cv[st]);
      }
      printf("\n");
      for (int j = 0; j < min((int)vv.size(), t); j++) printf("%d ", vv[j]);
      int comp = vv.size();
      if (t > vv.size()) {
        for (; (st < cv.size()) && (comp < t); comp++, st++)
          printf("%d ", cv[st]);
      }
      return 0;
    }
  }
  printf("NO\n");
  return 0;
}
long long GCD(long long a, long long b) {
  if (!b)
    return a;
  else
    return GCD(b, a % b);
}
long long exp(long long a, long long b, long long c) {
  long long ret = 1LL;
  long long mult = a;
  while (b) {
    if (b & 1) ret = (ret * mult) % c;
    mult = (mult * mult) % c;
    b >>= 1;
  }
  return ret;
}
int count(long long x) {
  int ret = 0;
  while (x) {
    if (x & 1) ret++;
    x >>= 1LL;
  }
  return ret;
}
bool isone(long long x, int pos) { return x & (1 << pos); }
