#include <bits/stdc++.h>
using namespace std;
const int MOD(1000000007);
const int INF((1 << 30) - 1);
const int MAXN(100005);
vector<int> a[MAXN];
pair<int, int> e[MAXN];
int head, tail, deg[MAXN];
void solve(int u, int v) {
  vector<int> h, t, c;
  int i = 0, j = 0;
  while (i < deg[u] || j < deg[v]) {
    if (c.size() == head + tail) break;
    if (h.size() == head && t.size() == tail) break;
    if (i < deg[u] && a[u][i] == v) {
      i++;
      continue;
    }
    if (j < deg[v] && a[v][j] == u) {
      j++;
      continue;
    }
    if (a[u][i] == a[v][j]) {
      c.push_back(a[u][i]);
      i++;
      j++;
    } else if (a[u][i] < a[v][j]) {
      if (h.size() < head) h.push_back(a[u][i]);
      i++;
    } else {
      if (t.size() < tail) t.push_back(a[v][j]);
      j++;
    }
  }
  int now = 0;
  while (h.size() < head && now < c.size()) {
    h.push_back(c[now]);
    now++;
  }
  while (t.size() < tail && now < c.size()) {
    t.push_back(c[now]);
    now++;
  }
  if (h.size() != head || t.size() != tail) return;
  printf("YES\n");
  printf("%d %d\n", u, v);
  for (int i = 0; i < h.size(); i++) printf("%d ", h[i]);
  printf("\n");
  for (int i = 0; i < t.size(); i++) printf("%d ", t[i]);
  exit(0);
}
int main() {
  int n, m;
  scanf("%d%d%d%d", &n, &m, &head, &tail);
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    a[u].push_back(v);
    deg[u]++;
    a[v].push_back(u);
    deg[v]++;
    e[i] = pair<int, int>(u, v);
  }
  for (int i = 1; i <= n; i++) {
    a[i].push_back(INF);
    sort(a[i].begin(), a[i].end());
  }
  for (int i = 0; i < m; i++) {
    int u = e[i].first, v = e[i].second;
    if (deg[u] >= head + 1 && deg[v] >= tail + 1) solve(u, v);
    if (deg[v] >= head + 1 && deg[u] >= tail + 1) solve(v, u);
  }
  printf("NO");
}
