#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
vector<int> a[MAXN];
int used[MAXN];
int ar[MAXN], vyv[MAXN];
int n, m, h, t;
void print(int u, int v) {
  unordered_set<int> U, V, O;
  for (int to : a[u]) {
    if (to != v) U.insert(to);
  }
  for (int to : a[v]) {
    if (to != u) V.insert(to);
  }
  for (int to : U) {
    if (V.count(to)) O.insert(to);
  }
  for (int to : O) {
    V.erase(to);
    U.erase(to);
  }
  int szU = U.size();
  int szV = V.size();
  int szO = O.size();
  int needV = max(0, t - szV);
  szO -= needV;
  int needU = max(0, h - szU);
  if (needU <= szO && szO >= 0) {
    cout << "YES\n" << u << ' ' << v << "\n";
    int s = 0;
    for (int to : U) {
      if (s == h) break;
      cout << to << ' ';
      s++;
    }
    unordered_set<int> used;
    for (int to : O) {
      if (s == h) break;
      used.insert(to);
      cout << to << ' ';
      s++;
    }
    for (int to : used) O.erase(to);
    cout << "\n";
    s = 0;
    for (int to : V) {
      if (s == t) break;
      cout << to << ' ';
      s++;
    }
    for (int to : O) {
      if (s == t) break;
      cout << to << ' ';
      s++;
    }
    cout << "\n";
    exit(0);
  }
}
void use(int u, int v) {
  if (a[u].size() >= h + t + 1 || a[v].size() >= h + t + 1) print(u, v);
  int szO = 0;
  for (int to : a[u]) ar[to] = 1;
  for (int to : a[v])
    if (ar[to] == 1 && to != v) szO++;
  int szU = (int)a[u].size() - 1 - szO;
  int szV = (int)a[v].size() - 1 - szO;
  int needV = max(0, t - szV);
  szO -= needV;
  int needU = max(0, h - szU);
  if (needU <= szO && szO >= 0) print(u, v);
  for (int to : a[u]) ar[to] = 0;
}
void go(int u, int v) {
  if (a[u].size() >= h + 1 && a[v].size() >= t + 1) {
    use(u, v);
  }
  if (a[u].size() >= t + 1 && a[v].size() >= h + 1) {
    swap(u, v);
    use(u, v);
  }
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m >> h >> t;
  vector<pair<int, int>> rb;
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    a[u].push_back(v);
    a[v].push_back(u);
    rb.push_back({u, v});
  }
  for (auto i : rb) {
    go(i.first, i.second);
  }
  cout << "NO\n";
  return 0;
}
