#include <bits/stdc++.h>
using namespace std;
vector<int> graph[100010];
int n, m, h, t, visited[100010];
int flg[100010];
int mk = 0;
int p1 = -1, p2 = -1;
vector<int> a, b;
void dfs(int s) {
  if (mk) return;
  visited[s] = 1;
  for (auto d : graph[s]) {
    if (!visited[d]) dfs(d);
    if (mk) return;
    if (graph[s].size() < h + 1 || graph[d].size() < t + 1) continue;
    if (graph[s].size() >= h + t + 1) {
      p1 = s, p2 = d;
      mk = 1;
      int iter = 0;
      while (b.size() < t) {
        if (graph[d][iter] != s)
          b.push_back(graph[d][iter]), flg[graph[d][iter]] = 1;
        iter++;
      }
      iter = 0;
      while (a.size() < h) {
        if (graph[s][iter] != d && !flg[graph[s][iter]])
          a.push_back(graph[s][iter]);
        iter++;
      }
    } else if (graph[d].size() >= h + t + 1) {
      p1 = s, p2 = d;
      mk = 1;
      int iter = 0;
      while (a.size() < h) {
        if (graph[s][iter] != d)
          a.push_back(graph[s][iter]), flg[graph[s][iter]] = 1;
        iter++;
      }
      iter = 0;
      while (b.size() < t) {
        if (graph[d][iter] != s && !flg[graph[d][iter]])
          b.push_back(graph[d][iter]);
        iter++;
      }
    } else if (graph[s].size() < h + t + 1 && graph[d].size() < h + t + 1) {
      int iter = 0;
      int ct = 0;
      vector<int> com;
      for (auto i : graph[s]) flg[i]++;
      for (auto i : graph[d]) {
        flg[i]++;
        if (flg[i] == 2 && i != s) ct++, com.push_back(i);
      }
      for (auto i : graph[s]) {
        if (i != d && flg[i] != 2 && a.size() < h) a.push_back(i);
      }
      for (auto i : graph[d]) {
        if (i != s && flg[i] != 2 && b.size() < t) b.push_back(i);
      }
      int rem = h - a.size() + t - b.size();
      if (ct < rem) {
        a.clear();
        b.clear();
        for (auto i : graph[s]) flg[i] = 0;
        for (auto i : graph[d]) flg[i] = 0;
      } else {
        int iter = 0;
        while (a.size() < h) a.push_back(com[iter++]);
        while (b.size() < t) b.push_back(com[iter++]);
        mk = 1;
        p1 = s, p2 = d;
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m >> h >> t;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  for (int i = 1; i <= n; i++)
    if (!visited[i]) dfs(i);
  if (mk) {
    cout << "YES\n";
    cout << p1 << " " << p2 << '\n';
    for (auto s : a) cout << s << " ";
    cout << '\n';
    for (auto s : b) cout << s << " ";
  } else {
    cout << "NO\n";
  }
}
