#include <bits/stdc++.h>
using namespace std;
int n, m, h, t, x, y;
vector<int> s[100100];
int a[100100], b[100100];
bool bj[100100][2];
void out(int u, int v) {
  int su = s[u].size(), sv = s[v].size();
  int same = 0, i = 0, j = 0;
  while (i < su && j < sv) {
    if (s[u][i] == s[v][j])
      same++, bj[i][0] = 1, bj[j][1] = 1, i++, j++;
    else if (s[u][i] > s[v][j])
      j++;
    else
      i++;
  }
  printf("YES\n%d %d\n", u, v);
  for (int i = 0; i < su; i++)
    if (s[u][i] != v) {
      if (!h) break;
      if (!bj[i][0]) {
        printf("%d ", s[u][i]);
        h--;
      }
    }
  for (int i = 0; i < su; i++)
    if (s[u][i] != v) {
      if (!h) break;
      if (bj[i][0]) {
        printf("%d ", s[u][i]);
        h--;
      }
    }
  puts("");
  for (int i = 0; i < sv; i++)
    if (s[v][i] != u) {
      if (!t) break;
      if (!bj[i][1]) {
        printf("%d ", s[v][i]);
        t--;
      }
    }
  for (int i = sv - 1; i >= 0; i--)
    if (s[v][i] != u) {
      if (!t) break;
      if (bj[i][1]) {
        printf("%d ", s[v][i]);
        t--;
      }
    }
  puts("");
}
bool found(int u, int v) {
  int su = s[u].size(), sv = s[v].size();
  if (su - 1 < h || sv - 1 < t) return 0;
  int same = 0, i = 0, j = 0;
  while (i < su && j < sv) {
    if (s[u][i] == s[v][j])
      same++, i++, j++;
    else if (s[u][i] > s[v][j])
      j++;
    else
      i++;
  }
  if (su + sv - same - 2 >= h + t) {
    out(u, v);
    return 1;
  }
  return 0;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &h, &t);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    s[x].push_back(y);
    s[y].push_back(x);
    a[i] = x, b[i] = y;
  }
  for (int i = 1; i <= n; i++) sort(s[i].begin(), s[i].end());
  for (int i = 1; i <= m; i++) {
    if (found(a[i], b[i])) return 0;
    if (found(b[i], a[i])) return 0;
  }
  puts("NO");
  return 0;
}
