#include <bits/stdc++.h>
using namespace std;
void IO() {
  mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
int N;
long long int n, p, m, M;
vector<int> unlocked;
vector<vector<int>> g, gt;
vector<bool> visited;
vector<int> order, comp;
vector<bool> assignment;
void dfs1(int v) {
  visited[v] = true;
  for (int u : g[v]) {
    if (!visited[u]) dfs1(u);
  }
  order.push_back(v);
}
void dfs2(int v, int cl) {
  comp[v] = cl;
  for (int u : gt[v]) {
    if (comp[u] == -1) dfs2(u, cl);
  }
}
bool solve_2SAT() {
  visited.assign(N, false);
  for (int i = 0; i < N; ++i) {
    if (!visited[i]) dfs1(i);
  }
  comp.assign(N, -1);
  for (int i = 0, j = 0; i < N; ++i) {
    int v = order[N - i - 1];
    if (comp[v] == -1) dfs2(v, j++);
  }
  assignment.assign(N / 2, false);
  for (int i = 0; i < N / 2; i++) {
    if (comp[i] == comp[m + i]) return false;
    assignment[i] = comp[i] > comp[m + i];
  }
  return true;
}
bool overlap(pair<int, int> &a, pair<int, int> &b) {
  long long int mini = min(a.second, b.second);
  long long int maxi = max(a.first, b.first);
  return maxi <= mini;
}
pair<int, int> giveIntersect(pair<int, int> &a, pair<int, int> &b) {
  long long int mini = min(a.second, b.second);
  long long int maxi = max(a.first, b.first);
  return make_pair(maxi, mini);
}
int main() {
  IO();
  cin >> n >> p >> M >> m;
  N = 2 * p;
  long long int x, y;
  g.resize(N);
  gt.resize(N);
  for (__typeof(n) i = (0) - ((0) > (n)); i != (n) - ((0) > (n));
       i += 1 - 2 * ((0) > (n))) {
    cin >> x >> y;
    x--;
    y--;
    g[x + p].push_back(y);
    g[y + p].push_back(x);
    gt[y].push_back(x + p);
    gt[x].push_back(y + p);
  }
  vector<pair<int, int>> ranges(p);
  for (__typeof(p) i = (0) - ((0) > (p)); i != (p) - ((0) > (p));
       i += 1 - 2 * ((0) > (p))) {
    cin >> ranges[i].first >> ranges[i].second;
  }
  for (__typeof(m) i = (0) - ((0) > (m)); i != (m) - ((0) > (m));
       i += 1 - 2 * ((0) > (m))) {
    cin >> x >> y;
    x--;
    y--;
    g[x].push_back(y + p);
    g[y].push_back(x + p);
    gt[x + p].push_back(y);
    gt[y + p].push_back(x);
  }
  if (solve_2SAT()) {
    pair<int, int> st = make_pair(1, 4e5);
    long long int cnt = 0;
    for (__typeof(p) i = (0) - ((0) > (p)); i != (p) - ((0) > (p));
         i += 1 - 2 * ((0) > (p))) {
      if (assignment[i]) {
        cnt++;
        if (overlap(st, ranges[i])) {
          st = giveIntersect(st, ranges[i]);
        } else {
          cout << -1;
          return 0;
        }
      }
    }
    if (st.first <= M) {
      cout << cnt << " " << st.first << "\n";
      for (__typeof(p) i = (0) - ((0) > (p)); i != (p) - ((0) > (p));
           i += 1 - 2 * ((0) > (p))) {
        if (assignment[i]) cout << i + 1 << " ";
      }
    } else
      cout << -1;
  } else {
    cout << -1;
  }
  return 0;
}
