#include <bits/stdc++.h>
using namespace std;
int next_int;
char in_char;
inline int GetNextInt() {
  in_char = ' ';
  while ((in_char < '0') || (in_char > '9')) {
    in_char = getchar();
  }
  next_int = 0;
  while ((in_char >= '0') && (in_char <= '9')) {
    next_int *= 10;
    next_int += in_char - 48;
    in_char = getchar();
  }
  return next_int;
}
long long PowerMod(long long base, long long power, long long mod) {
  long long ret = 1;
  if (base >= mod) {
    base %= mod;
  }
  while (power > 0) {
    if ((power & 1) == 1) {
      ret *= base;
      if (ret >= mod) {
        ret %= mod;
      }
    }
    power >>= 1;
    base *= base;
    if (base >= mod) {
      base %= mod;
    }
  }
  return ret;
}
inline bool validchar(char ch) {
  if ((ch >= 'a') && (ch <= 'z')) {
    return true;
  }
  if ((ch >= 'A') && (ch <= 'Z')) {
    return true;
  }
  if ((ch >= '0') && (ch <= '9')) {
    return true;
  }
  return false;
}
vector<string> GetStringsFromLine() {
  vector<string> ret;
  char ch;
  string s;
  ch = ' ';
  while (true) {
    while (!validchar(ch)) {
      if (ch == '\n') {
        return ret;
      }
      ch = getchar();
    }
    s = "";
    while (validchar(ch)) {
      s = s + ch;
      ch = getchar();
    }
    ret.push_back(s);
  }
}
int chest = -1, stomach = -1;
int h, t;
bool vis[1000000];
vector<int> head, tail, hv, tv, adj[1000000];
void printans() {
  if (chest == -1) {
    printf("NO\n");
  } else {
    printf("YES\n");
    printf("%d %d\n", chest, stomach);
    for (int k = h - 1; k >= 0; k--) {
      printf("%d ", head[k]);
    }
    printf("\n");
    for (int k = tail.size() - 1; k >= 0; k--) {
      printf("%d ", tail[k]);
    }
  }
}
inline void Solve() {
  int n, m, u, v, k, i, j, hs, ts, nt;
  n = GetNextInt();
  m = GetNextInt();
  h = GetNextInt();
  t = GetNextInt();
  for (int i = 0; i < m; i++) {
    u = GetNextInt();
    v = GetNextInt();
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (u = 1; u <= n; u++) {
    if (adj[u].size() <= h) {
      continue;
    }
    for (j = adj[u].size() - 1; j >= 0; j--) {
      v = adj[u][j];
      if (adj[v].size() <= t) {
        continue;
      }
      hv.clear();
      tv.clear();
      hs = min(201, (int)adj[u].size());
      for (k = hs - 1; k >= 0; k--) {
        if (adj[u][k] != v) {
          hv.push_back(adj[u][k]);
        }
      }
      hs = hv.size();
      ts = min(201, (int)adj[v].size());
      for (k = ts - 1; k >= 0; k--) {
        if (adj[v][k] != u) {
          tv.push_back(adj[v][k]);
        }
      }
      ts = tv.size();
      for (k = hs - 1; k >= 0; k--) {
        vis[hv[k]] = true;
      }
      nt = 0;
      for (k = ts - 1; k >= 0; k--) {
        if (vis[tv[k]] == false) {
          nt++;
        }
      }
      if (nt >= t) {
        chest = u;
        stomach = v;
        for (k = h - 1; k >= 0; k--) {
          head.push_back(hv[k]);
        }
        for (k = ts - 1; k >= 0; k--) {
          if (vis[tv[k]] == false) {
            tail.push_back(tv[k]);
            t--;
            if (t == 0) {
              break;
            }
          }
        }
        printans();
        return;
      } else {
        if (hs - h >= t - nt) {
          chest = u;
          stomach = v;
          t -= nt;
          for (k = ts - 1; k >= 0; k--) {
            if (vis[tv[k]] == false) {
              tail.push_back(tv[k]);
            } else {
              if (t > 0) {
                tail.push_back(tv[k]);
                vis[tv[k]] = false;
                t--;
              }
            }
          }
          for (k = hs - 1; k >= 0; k--) {
            if (vis[hv[k]] == true) {
              head.push_back(hv[k]);
            }
          }
          printans();
          return;
        }
      }
      for (k = hs - 1; k >= 0; k--) {
        vis[hv[k]] = false;
      }
    }
  }
  printans();
}
int main() {
  int t;
  t = 1;
  while (t--) {
    Solve();
  }
  return 0;
}
