#include <bits/stdc++.h>
using namespace std;
int n, m, h, t;
int in[100005];
vector<int> vct[100005];
struct node {
  int u, v;
} e[100005 << 1];
int flag = 0;
int main() {
  while (scanf("%d %d %d %d", &n, &m, &h, &t) != -1) {
    int i, u, v;
    for (i = 1; i <= m; i++) {
      scanf("%d %d", &u, &v);
      e[i].u = u;
      e[i].v = v;
      e[i + m].u = v;
      e[i + m].v = u;
      vct[u].push_back(v);
      vct[v].push_back(u);
      in[u]++, in[v]++;
    }
    for (i = 1; i <= n; i++) sort(vct[i].begin(), vct[i].end());
    flag = 0;
    for (i = 1; i <= 2 * m && !flag; i++) {
      u = e[i].u;
      v = e[i].v;
      if (in[u] <= h || in[v] <= t) continue;
      int tu = min(h + t + 2, in[u]);
      int tv = min(h + t + 2, in[v]);
      int j = 0, k = 0;
      vector<int> a, b, c;
      while (1) {
        if (vct[u][j] == v) j++;
        if (vct[v][k] == u) k++;
        if (j >= tu && k >= tv) break;
        if (j >= tu)
          b.push_back(vct[v][k++]);
        else if (k >= tv)
          a.push_back(vct[u][j++]);
        else if (vct[u][j] < vct[v][k])
          a.push_back(vct[u][j++]);
        else if (vct[u][j] > vct[v][k])
          b.push_back(vct[v][k++]);
        else {
          c.push_back(vct[u][j]);
          j++, k++;
        }
      }
      int ta = max(h - (int)a.size(), 0);
      int tb = max(t - (int)b.size(), 0);
      if (c.size() >= ta + tb) {
        for (j = 0; j < ta; j++) a.push_back(c[j]);
        for (j = ta; j < ta + tb; j++) b.push_back(c[j]);
        flag = 1;
        printf("YES\n");
        printf("%d %d\n", u, v);
        printf("%d", a[0]);
        for (j = 1; j < h; j++) printf(" %d", a[j]);
        printf("\n");
        printf("%d", b[0]);
        for (j = 1; j < t; j++) printf(" %d", b[j]);
        printf("\n");
      }
    }
    if (!flag) printf("NO\n");
  }
  return 0;
}
