#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
bool used[N];
vector<int> adj[N], U, V, common;
void print(int h, int t) {
  for (int i = 0; i < h; i++) cout << U[i] << " ";
  cout << '\n';
  for (int i = 0; i < t; i++) cout << V[i] << " ";
  cout << '\n';
}
bool valid(int h, int t, int a, int b, int c) {
  h -= a, t -= b;
  if (h > 0) c -= h;
  if (c < 0) return false;
  if (t > 0) t -= c;
  if (t > 0) return false;
  return true;
}
bool process(int u, int v, int h, int t) {
  U.clear();
  V.clear();
  common.clear();
  int degU = adj[u].size() - 1, degV = adj[v].size() - 1, tmp, indice = 0,
      H = h, T = t;
  if (degU < h or degV < t)
    return false;
  else if (degU >= h + t or degV >= h + t) {
    cout << "YES" << '\n' << u << " " << v << '\n';
    if (degV >= h + t) {
      for (int i = 0; i <= h; i++) {
        tmp = adj[u][i];
        if (tmp != v) U.push_back(tmp), used[tmp] = true;
      }
      for (int i = 0; t != 0; i++) {
        tmp = adj[v][i];
        if (tmp != u and used[tmp] == false) V.push_back(tmp), t--;
      }
      for (int i = 0; i <= h; i++) used[adj[u][i]] = false;
      print(H, T);
    } else if (degU >= h + t) {
      for (int i = 0; i <= t; i++) {
        tmp = adj[v][i];
        if (tmp != u) V.push_back(tmp), used[tmp] = true;
      }
      for (int i = 0; h != 0; i++) {
        tmp = adj[u][i];
        if (tmp != v and used[tmp] == false) U.push_back(tmp), h--;
      }
      for (int i = 0; i <= t; i++) used[adj[v][i]] = false;
      print(H, T);
    }
    return true;
  } else {
    for (int i = 0; i < adj[u].size(); i++) {
      tmp = adj[u][i];
      if (tmp != v) used[tmp] = true;
    }
    for (int i = 0; i < adj[v].size(); i++) {
      tmp = adj[v][i];
      if (tmp != u) {
        if (used[tmp] == true)
          common.push_back(tmp), used[tmp] = false;
        else
          V.push_back(tmp);
      }
    }
    for (int i = 0; i < adj[u].size(); i++) {
      tmp = adj[u][i];
      if (tmp != v and used[tmp] == true) U.push_back(tmp), used[tmp] = false;
    }
    if (valid(h, t, U.size(), V.size(), common.size())) {
      cout << "YES" << '\n' << u << " " << v << '\n';
      for (int i = 0; i < U.size() and h != 0; i++) {
        cout << U[i] << " ";
        h--;
      }
      for (indice = 0; indice < common.size() and h != 0; indice++) {
        cout << common[indice] << " ";
        h--;
      }
      cout << '\n';
      for (int i = indice; i < common.size() and t != 0; i++) {
        cout << common[i] << " ";
        t--;
      }
      for (int i = 0; i < V.size() and t != 0; i++) {
        cout << V[i] << " ";
        t--;
      }
      cout << '\n';
      return true;
    } else
      return false;
  }
}
int main() {
  int n, m, h, t, u, v;
  scanf("%d %d %d %d", &n, &m, &h, &t);
  while (m--) {
    scanf("%d %d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 1; i <= n; i++)
    for (int j = 0; j < adj[i].size(); j++)
      if (process(i, adj[i][j], h, t)) goto exit;
  cout << "NO" << '\n';
exit:;
  return 0;
}
