#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const long long mx = 4e5 + 4;
bool vis[4 * mx];
vector<long long> order;
long long comp[4 * mx];
vector<long long> result;
vector<long long> adj[4 * mx], rev[4 * mx];
long long n, p, M, m;
long long expo_pow(long long x, long long y) {
  if (y == 0) return 1;
  y = y % (mod - 1);
  x %= mod;
  if (y == 0) y = mod - 1;
  long long res = 1;
  while (y) {
    if (y & 1) res = (res * x) % mod;
    x = (x * x) % mod;
    y >>= 1;
  }
  return res;
}
void add_edge(long long x, long long y) {
  adj[x].push_back(y);
  rev[y].push_back(x);
}
void add(long long x, long long y) {
  if (x % 2 == 1) {
    add_edge(x + 1, y);
  } else
    add_edge(x - 1, y);
  if (y % 2 == 1)
    add_edge(y + 1, x);
  else
    add_edge(y - 1, x);
}
void dfs1(long long cur) {
  vis[cur] = 1;
  for (auto u : adj[cur]) {
    if (vis[u] == 0) dfs1(u);
  }
  order.push_back(cur);
}
void dfs2(long long cur, long long cnt) {
  comp[cur] = cnt;
  for (auto u : rev[cur]) {
    if (comp[u] == 0) dfs2(u, cnt);
  }
}
bool solve_2sat() {
  long long sz = 2 * p + 2 * M + 2;
  for (long long i = 1; i <= sz; i++) {
    if (!vis[i]) dfs1(i);
  }
  long long cnt = 1;
  reverse(order.begin(), order.end());
  for (auto u : order) {
    if (comp[u] == 0) {
      dfs2(u, cnt);
      cnt++;
    }
  }
  for (long long i = 1; i < sz; i += 2) {
    if (comp[i] == comp[i + 1]) {
      return false;
    } else if (comp[i] > comp[i + 1])
      result.push_back(i);
  }
  return true;
}
void solve() {
  cin >> n >> p >> M >> m;
  for (long long i = 0; i < n; i++) {
    long long x, y;
    cin >> x >> y;
    add(2 * x - 1, 2 * y - 1);
  }
  for (long long i = 0; i < p; i++) {
    long long l, r;
    cin >> l >> r;
    add(2 * p + 2 * l - 1, (i + 1) * 2);
    add(2 * p + 2 * r + 2, (i + 1) * 2);
  }
  for (long long i = 0; i < m; i++) {
    long long u, v;
    cin >> u >> v;
    add(2 * u, 2 * v);
  }
  for (long long i = 0; i < M; i++) {
    add(2 * p + 2 * i + 1, 2 * p + 2 * (i + 1) + 2);
  }
  bool fl = solve_2sat();
  if (!fl) {
    cout << "-1\n";
    return;
  }
  long long ans = 1;
  vector<long long> station;
  for (auto u : result) {
    if (u < 2 * p)
      station.push_back(u / 2 + 1);
    else
      ans = max(ans, (u - 2 * p) / 2 + 1);
  }
  cout << station.size() << " " << ans << "\n";
  for (auto u : station) {
    cout << u << " ";
  }
  cout << "\n";
}
signed main() {
  long long test = 1;
  long long i = 1;
  while (test--) {
    solve();
  }
}
