#include <bits/stdc++.h>
#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2,fma,tune=native")
using namespace std;
const long long maxn = 9e5 + 100;
const long long mod = 1e9 + 7;
const long double PI = 4 * atan((long double)1);
long long pw(long long a, long long b) {
  return (!b ? 1
             : (b & 1 ? a * pw(a * a % mod, b / 2) % mod
                      : pw(a * a % mod, b / 2) % mod));
}
int n, m, h, t;
vector<int> adj[maxn];
bool used[maxn], tek[maxn];
pair<int, int> e[maxn];
bool solve(int u, int v) {
  if (adj[u].size() <= h or adj[v].size() <= t) {
    return (0);
  }
  if (adj[u].size() > h + t) {
    cout << "YES" << '\n';
    cout << u << ' ' << v << '\n';
    for (auto i : adj[v]) {
      if (i != u and t) {
        --t;
        used[i] = 1;
      }
    }
    for (auto i : adj[u]) {
      if (i != v and !used[i] and h) {
        --h;
        cout << i << ' ';
      }
    }
    cout << '\n';
    for (auto i : adj[v]) {
      if (used[i]) {
        cout << i << ' ';
      }
    }
    return (1);
  }
  if (adj[v].size() > h + t) {
    cout << "YES" << '\n';
    cout << u << ' ' << v << '\n';
    for (auto i : adj[u]) {
      if (i != v and h) {
        --h;
        used[i] = 1;
        cout << i << ' ';
      }
    }
    cout << '\n';
    for (auto i : adj[v]) {
      if (!used[i] and i != u and t) {
        --t;
        cout << i << ' ';
      }
    }
    return (1);
  }
  for (auto i : adj[u]) {
    used[i] = 1;
  }
  int cnt = 0;
  vector<int> tekrary;
  for (auto i : adj[v]) {
    if (used[i]) {
      cnt++;
      tek[i] = 1;
      tekrary.push_back(i);
      ;
    }
  }
  for (auto i : adj[u]) {
    used[i] = 0;
  }
  if (h + t <= adj[u].size() + adj[v].size() - cnt - 2) {
    cout << "YES" << '\n';
    cout << u << ' ' << v << '\n';
    vector<int> ans1, ans2;
    for (auto i : adj[u]) {
      if (i != v and h and !tek[i]) {
        h--;
        ans1.push_back(i);
        ;
      }
    }
    for (auto i : adj[v]) {
      if (i != u and t and !tek[i]) {
        t--;
        ans2.push_back(i);
        ;
      }
    }
    for (int i = 0; i < h; i++) {
      ans1.push_back(tekrary.back());
      ;
      tekrary.pop_back();
    }
    for (int i = 0; i < t; i++) {
      ans2.push_back(tekrary.back());
      ;
      tekrary.pop_back();
    }
    for (int i = 0; i < ans1.size(); i++) {
      cout << ans1[i] << ' ';
    }
    cout << '\n';
    for (int i : ans2) {
      cout << i << ' ';
    }
    return (1);
  }
  tekrary.clear();
  for (auto i : adj[u]) {
    tek[i] = 0;
  }
  return (0);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> h >> t;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    ;
    adj[v].push_back(u);
    ;
    e[i] = {u, v};
  }
  for (int i = 1; i <= m; i++) {
    int u = e[i].first, v = e[i].second;
    if (solve(u, v)) {
      return (0);
    }
    if (solve(v, u)) {
      return (0);
    }
  }
  cout << "NO";
  return (0);
}
