#include <bits/stdc++.h>
void chkmin(int &x, const int &y) {
  if (x > y) x = y;
}
void chkmax(int &x, const int &y) {
  if (x < y) x = y;
}
struct pair {
  int l, r, id;
  explicit pair(int l = 0, int r = 0, int id = 0) : l(l), r(r), id(id) {}
};
const int N = 400000 + 47;
const int P = N * 8 + 47;
const int E = N * 10 + 47;
const int INF = 0x3f3f3f3f;
int head[P], nxt[E], to[E], tot;
int pp[N], xle[N], xri[N], xpp[N], cp = 1;
int vis[P], stk[P], dfn[P], low[P], *top = stk, cnt;
int u[E], v[E], d[P], sq[P], nu[P];
int col[P];
int n, p, m, q;
pair a[N];
int ans[N], cas;
void add(int x, int y) {
  if (tot > E) throw "s";
  nxt[++tot] = head[x], head[x] = tot, to[tot] = y;
  u[tot] = x, v[tot] = y;
}
void tarjan(int x) {
  *++top = x, vis[x] = 1, dfn[x] = low[x] = ++cnt;
  for (int i = head[x]; i; i = nxt[i])
    if (!dfn[to[i]])
      tarjan(to[i]), chkmin(low[x], low[to[i]]);
    else if (vis[to[i]])
      chkmin(low[x], dfn[to[i]]);
  if (dfn[x] == low[x]) {
    int c = x;
    if (x > xpp[n] && *top != x) {
      for (int *p = top;; --p)
        if (*p <= xpp[n]) {
          c = *p;
          break;
        } else if (*p == x)
          throw 3;
    }
    while (*top != x) vis[*top] = 0, col[*top] = c, --top;
    vis[x] = 0, col[x] = c, --top;
  }
}
void input(int &x) {
  char c;
  for (c = getchar(); c > '9' || c < '0'; c = getchar())
    ;
  for (x = 0; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
}
int main() {
  int x, y, z;
  input(p), input(n), input(m), input(q);
  for (int i = 1; i <= n; ++i) pp[i] = ++cp, xpp[i] = ++cp;
  for (int i = 1; i <= p; ++i)
    input(x), input(y), add(xpp[x], pp[y]), add(xpp[y], pp[x]);
  for (int i = 1; i <= n; ++i) input(a[i].l), input(a[i].r), a[i].id = i;
  for (int i = 1; i <= q; ++i)
    input(x), input(y), add(pp[x], xpp[y]), add(pp[y], xpp[x]);
  auto f = [](pair x, pair y) { return x.l != y.l ? x.l < y.l : x.id < y.id; };
  std::sort(a + 1, a + n + 1, f);
  xle[n] = xpp[a[n].id];
  for (int i = n - 1; i >= 1; --i) {
    xle[i] = ++cp;
    nu[++cp] = 1;
    add(xle[i], xle[i + 1]), add(xle[i], xpp[a[i].id]);
  }
  for (int i = 1; i <= n; ++i) {
    x = std::upper_bound(a + 1, a + n + 1, pair(a[i].r, 0, INF), f) - a;
    if (x > 0 && x <= n) add(pp[a[i].id], xle[x]);
  }
  auto g = [](pair x, pair y) { return x.r != y.r ? x.r < y.r : x.id < y.id; };
  std::sort(a + 1, a + n + 1, g);
  xri[1] = xpp[a[1].id];
  for (int i = 2; i <= n; ++i) {
    xri[i] = ++cp;
    nu[++cp] = 1;
    add(xri[i], xri[i - 1]), add(xri[i], xpp[a[i].id]);
  }
  for (int i = 1; i <= n; ++i) {
    x = std::lower_bound(a + 1, a + n + 1, pair(0, a[i].l), g) - a - 1;
    if (x > 0 && x <= n) add(pp[a[i].id], xri[x]);
  }
  for (int i = 2; i <= cp; ++i)
    if (!dfn[i] && !nu[i]) tarjan(i);
  for (int i = 1; i <= n; ++i)
    if (col[pp[i]] == col[xpp[i]]) return puts("-1"), 0;
  top = stk, x = tot, tot = 0;
  memset(nxt, 0, sizeof nxt);
  memset(head, 0, sizeof head);
  for (int i = 1; i <= x; ++i)
    if (col[u[i]] != col[v[i]]) ++d[col[u[i]]], add(col[v[i]], col[u[i]]);
  for (int i = 2; i <= cp; ++i)
    if (!d[i] && i == col[i]) *++top = i;
  while (stk != top) {
    y = *top--;
    if (!sq[y])
      sq[y] = 1, sq[col[y ^ 1]] = -1;
    else
      sq[col[y ^ 1]] = -sq[y];
    for (int i = head[y]; i; i = nxt[i]) {
      if (sq[y] == -1) sq[to[i]] = -1;
      if (!--d[to[i]]) *++top = to[i];
    }
  }
  for (int i = 1; i <= n; ++i)
    if (sq[col[pp[i]]] == 1) ans[++cas] = i;
  std::sort(a + 1, a + n + 1, [](pair x, pair y) { return x.id < y.id; });
  x = 0;
  for (int i = 1; i <= cas; ++i) chkmax(x, a[ans[i]].l);
  printf("%d %d\n", cas, x);
  for (int i = 1; i <= cas; ++i) printf("%d ", ans[i]);
  putchar(10);
  return 0;
}
