#include <bits/stdc++.h>
using namespace std;
vector<int> v[100100];
int S[100100], E[100100];
int d[100100];
int vis[100100], V = 0;
int ans[100100];
int h, t;
bool can(int s, int e) {
  int a = 0;
  V++;
  if (d[s] - 1 < h || d[e] - 1 < t) return 0;
  for (int i = 0; i < d[s]; i++) {
    int j = v[s][i];
    if (j == e) continue;
    int p = lower_bound(v[e].begin(), v[e].end(), j) - v[e].begin();
    if (p < d[e] && v[e][p] == j) {
      ans[a++] = j;
      vis[j] = V;
    }
  }
  int lo = ((0) > (h + a + 1 - d[s]) ? (0) : (h + a + 1 - d[s]));
  int hi = ((a) < (d[e] - t - 1) ? (a) : (d[e] - t - 1));
  if (lo > hi) return 0;
  puts("YES");
  printf("%d %d\n", s, e);
  bool bf = 0;
  int cnt = 0;
  for (int i = 0; i < d[s] && cnt < h; i++) {
    int j = v[s][i];
    if (j == e) continue;
    if (vis[j] != V) {
      if (bf) putchar(' ');
      printf("%d", j), bf = 1, cnt++;
    }
  }
  for (int i = 0; i < lo && cnt < h; i++) {
    if (bf) putchar(' ');
    printf("%d", ans[i]), bf = 1, cnt++;
  }
  puts("");
  bf = 0;
  cnt = 0;
  for (int i = 0; i < d[e] && cnt < t; i++) {
    int j = v[e][i];
    if (j == s) continue;
    if (vis[j] != V) {
      if (bf) putchar(' ');
      printf("%d", j), bf = 1, cnt++;
    }
  }
  for (int i = lo; i < a && cnt < t; i++) {
    if (bf) putchar(' ');
    printf("%d", ans[i]), bf = 1, cnt++;
  }
  puts("");
  return 1;
}
int main() {
  int n, m;
  scanf("%d %d %d %d", &n, &m, &h, &t);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", S + i, E + i);
    v[S[i]].push_back(E[i]);
    v[E[i]].push_back(S[i]);
    d[S[i]]++, d[E[i]]++;
  }
  for (int i = 1; i <= n; i++) sort(v[i].begin(), v[i].end());
  int i;
  for (i = 1; i <= m; i++) {
    if (can(S[i], E[i])) break;
    if (can(E[i], S[i])) break;
  }
  if (i > m) puts("NO");
}
