#include <bits/stdc++.h>
using namespace std;
bool debug = false;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
long long ln, lk, lm;
vector<int> mp[100005];
int d[100005];
int h, t;
vector<pair<int, int>> es;
bool vis[100005];
vector<int> pp(int x, int y, int tar, vector<int> &tmp) {
  vector<int> a;
  bool bb = tmp.empty();
  for (int node : mp[x]) {
    if (node == y) continue;
    auto it = lower_bound(mp[y].begin(), mp[y].end(), node);
    if (it != mp[y].end() && (*it) == node) {
      if (bb) tmp.push_back(*it);
      continue;
    }
    a.push_back(node);
    if (a.size() == tar) break;
  }
  return a;
}
void ppe(int x, int y, vector<int> a, vector<int> b) {
  printf("YES\n%d %d\n", x, y);
  for (int c : a) printf("%d ", c);
  puts("");
  for (int c : b) printf("%d ", c);
  exit(0);
}
void cal(int x, int y) {
  if (d[x] < h + 1 || d[y] < t + 1) return;
  vector<int> a, b, tt;
  if (d[y] >= h + t + 1) {
    for (int p : mp[x])
      if (p != y) {
        a.push_back(p);
        vis[p] = 1;
        if (a.size() == h) break;
      }
    for (int nd : mp[y])
      if (nd != x && !vis[nd]) {
        b.push_back(nd);
        if (b.size() == t) break;
      }
    ppe(x, y, a, b);
  }
  if (d[x] >= h + t + 1) {
    for (int p : mp[y])
      if (p != x) {
        b.push_back(p);
        vis[p] = 1;
        if (b.size() == t) break;
      }
    for (int nd : mp[x])
      if (nd != y && !vis[nd]) {
        a.push_back(nd);
        if (a.size() == h) break;
      }
    ppe(x, y, a, b);
  }
  int ca = 0, cb = 0, cc = 0;
  for (int p : mp[x])
    if (p != y) {
      vis[p] = 1;
      ca++;
      cc++;
    }
  for (int p : mp[y])
    if (p != x) {
      cb++;
      if (!vis[p]) cc++;
    }
  if (cc < h + t) {
    for (int p : mp[x])
      if (p != y) vis[p] = 0;
    return;
  }
  int xx = cc - cb;
  a = pp(x, y, h, tt);
  b = pp(y, x, t, tt);
  while (!tt.empty() && a.size() < h) {
    a.push_back(tt.back());
    tt.pop_back();
  }
  while (!tt.empty() && b.size() < t) {
    b.push_back(tt.back());
    tt.pop_back();
  }
  if (a.size() == h && b.size() == t) ppe(x, y, a, b);
}
int main() {
  scanf("%d%d%d%d", &n, &m, &h, &t);
  for (int i = 0, a, b; i < m; i++) {
    scanf("%d%d", &a, &b);
    mp[a].push_back(b);
    mp[b].push_back(a);
    es.push_back({a, b});
    d[a]++;
    d[b]++;
  }
  for (int i = 1; i <= n; i++) {
    sort(mp[i].begin(), mp[i].end());
    mp[i].resize(min((int)mp[i].size(), h + t + 1));
  }
  for (auto p : es) {
    int a = p.first, b = p.second;
    cal(a, b);
    cal(b, a);
  }
  puts("NO");
  return 0;
}
