#include <bits/stdc++.h>
using namespace std;
const int MAXN = (int)1e5 + 50;
int n, m, h, t;
vector<vector<int> > g(MAXN + 1);
vector<int> deg(MAXN + 1, 0);
vector<pair<int, int> > edges;
vector<bool> used(MAXN + 1, false);
void just_do_it(int u, int v) {
  cout << u << ' ' << v << endl;
  vector<int> head, tail;
  vector<int> bel(MAXN + 1, 0);
  bel[u] = bel[v] = -1;
  for (int i = 0; i < (int)g[u].size(); i++) {
    int to = g[u][i];
    bel[to]++;
  }
  for (int i = 0; i < (int)g[v].size(); i++) {
    int to = g[v][i];
    bel[to] += 2;
  }
  for (int i = 0; i < (int)g[u].size(); i++) {
    int to = g[u][i];
    if (bel[to] == 1)
      if (head.size() < h) {
        head.push_back(to);
        bel[to] = -1;
      }
  }
  for (int i = 0; i < (int)g[v].size(); i++) {
    int to = g[v][i];
    if (bel[to] == 2)
      if (tail.size() < t) {
        tail.push_back(to);
        bel[to] = -1;
      }
  }
  for (int i = 0; i < (int)g[u].size(); i++) {
    int to = g[u][i];
    if (bel[to] == 3)
      if (head.size() < h) {
        head.push_back(to);
        bel[to] = -1;
      }
  }
  for (int i = 0; i < (int)g[v].size(); i++) {
    int to = g[v][i];
    if (bel[to] == 3)
      if (tail.size() < t) {
        tail.push_back(to);
        bel[to] = -1;
      }
  }
  for (int i = 0; i < h; i++) cout << head[i] << ' ';
  cout << endl;
  for (int i = 0; i < t; i++) cout << tail[i] << ' ';
}
int main() {
  cin >> n >> m >> h >> t;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    edges.push_back(make_pair(u, v));
    edges.push_back(make_pair(v, u));
    deg[u]++;
    deg[v]++;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  pair<int, int> may_be(-1, -1);
  for (int i = 0; i < 2 * m; i++) {
    int u = edges[i].first, v = edges[i].second;
    if (deg[u] < h + 1 || deg[v] < t + 1) continue;
    if (deg[u] >= h + t + 1 || deg[v] >= h + t + 1) {
      may_be = make_pair(u, v);
      break;
    }
    int common = 0;
    for (int j = 0; j < (int)g[u].size(); j++) {
      int to = g[u][j];
      used[to] = true;
    }
    for (int j = 0; j < (int)g[v].size(); j++) {
      int to = g[v][j];
      if (used[to]) common++;
    }
    for (int j = 0; j < (int)g[u].size(); j++) {
      int to = g[u][j];
      used[to] = false;
    }
    if (deg[u] + deg[v] - 2 - common >= h + t) {
      may_be = make_pair(u, v);
      break;
    }
  }
  if (may_be.first != -1) {
    cout << "YES" << endl;
    just_do_it(may_be.first, may_be.second);
  } else
    cout << "NO" << endl;
  return 0;
}
