#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n, m, h, t, maxv;
int e[maxn][2];
set<int> mp[maxn];
vector<int> g[maxn];
vector<int> xv, yv;
set<int> comm;
bool check(int x, int y, vector<int> &xv, vector<int> &yv, set<int> &comm) {
  int lx = max(0, (int)(h - xv.size()));
  int ly = max(0, (int)(t - yv.size()));
  if (comm.size() >= lx + ly) {
    printf("YES\n");
    printf("%d %d\n", x, y);
    set<int>::iterator it = comm.begin();
    int mx = min((int)xv.size(), h);
    for (int i = 0; i < mx; i++) printf("%d ", xv[i]);
    for (int i = 0; i < lx; i++) {
      printf("%d ", *it);
      it++;
    }
    printf("\n");
    int my = min((int)yv.size(), t);
    for (int i = 0; i < my; i++) printf("%d ", yv[i]);
    for (int i = 0; i < ly; i++) {
      printf("%d ", *it);
      it++;
    }
    printf("\n");
    return true;
  }
  return false;
}
bool solve(int x, int y) {
  if (mp[x].size() <= h || mp[y].size() <= t) return false;
  int cnt = mp[x].size() - 1;
  for (int i = 0; i < g[y].size() && cnt < h + t; i++) {
    int tx = g[y][i];
    if (tx == x) continue;
    if (mp[x].count(tx) == 0) cnt++;
  }
  if (cnt < h + t) return false;
  xv.clear();
  yv.clear();
  comm.clear();
  for (set<int>::iterator it = mp[x].begin();
       it != mp[x].end() && xv.size() <= h && comm.size() <= maxv; it++) {
    int ty = *it;
    if (ty == y) continue;
    if (mp[y].find(ty) != mp[y].end())
      comm.insert(ty);
    else
      xv.push_back(ty);
  }
  for (set<int>::iterator it = mp[y].begin();
       it != mp[y].end() && yv.size() <= t && comm.size() <= maxv; it++) {
    int tx = *it;
    if (tx == x) continue;
    if (mp[x].find(tx) != mp[x].end())
      comm.insert(tx);
    else
      yv.push_back(tx);
  }
  if (check(x, y, xv, yv, comm)) return true;
  return false;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &h, &t);
  maxv = h + t;
  for (int i = 1; i <= n; i++) mp[i].clear();
  for (int i = 0; i < m; i++) {
    int tx, ty;
    scanf("%d%d", &tx, &ty);
    mp[tx].insert(ty);
    mp[ty].insert(tx);
    g[tx].push_back(ty);
    g[ty].push_back(tx);
  }
  int flags = false;
  for (int i = 1; i <= n; i++)
    if (flags == false)
      for (int j = 0; j < g[i].size(); j++) {
        if (solve(i, g[i][j])) {
          flags = true;
          break;
        }
      }
  if (!flags) printf("NO\n");
  return 0;
}
