#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
bool ckmin(int& a, int b) { return b < a ? a = b, true : false; }
bool ckmax(int& a, int b) { return b > a ? a = b, true : false; }
const long long linf = 4000000000000000000LL;
const long long inf = 1000000007;
const long double pi = 3.1415926535;
void pv(vector<int> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<long long> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<vector<int>> a) {
  for (int i = (0); i < (int(a.size())); ++i) {
    cout << i << '\n';
    pv(a[i]);
    cout << '\n';
  }
}
void pv(vector<vector<long long>> a) {
  for (int i = (0); i < (int(a.size())); ++i) {
    cout << i << '\n';
    pv(a[i]);
  }
  cout << '\n';
}
void pv(vector<string> a) {
  for (auto& x : a) cout << x << '\n';
  cout << '\n';
}
void setIO(string second) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  if (int(second.size())) {
    freopen((second + ".in").c_str(), "r", stdin);
    if (second != "test1") freopen((second + ".out").c_str(), "w", stdout);
  }
}
struct scc {
  int mode = 0;
  vector<vector<int>> g, gr;
  bitset<1600005> used;
  vector<int> order, component;
  void dfs1(int v) {
    used[v] = true;
    for (size_t i = 0; i < g[v].size(); ++i)
      if (!used[g[v][i]]) dfs1(g[v][i]);
    order.push_back(v);
  }
  void dfs2(int v) {
    used[v] = true;
    component.push_back(v);
    for (size_t i = 0; i < gr[v].size(); ++i)
      if (!used[gr[v][i]]) dfs2(gr[v][i]);
  }
  void init(vector<vector<int>>& adj) {
    mode = 1;
    int n = int(adj.size());
    g = adj;
    for (int i = (0); i < (int(adj.size())); ++i) {
      adj[i].clear();
      adj[i].shrink_to_fit();
    }
    adj.clear();
    adj.shrink_to_fit();
    gr.resize(n);
    for (int i = (0); i < (n); ++i) {
      for (auto& x : g[i]) {
        gr[x].push_back(i);
      }
    }
  }
  vector<int> get_component() {
    assert(mode);
    int n = int(g.size());
    vector<int> ans(n);
    for (int i = (0); i < (n); ++i)
      if (!used[i]) dfs1(i);
    for (int i = (0); i < (1600005); ++i) used[i] = 0;
    int count = 0;
    for (int i = (0); i < (n); ++i) {
      int v = order[n - 1 - i];
      if (!used[v]) {
        dfs2(v);
        for (auto& x : component) ans[x] = count;
        count++;
        component.clear();
      }
    }
    for (int i = (0); i < (int(gr.size())); ++i) {
      gr[i].clear();
      gr[i].shrink_to_fit();
    }
    gr.clear();
    gr.shrink_to_fit();
    return ans;
  }
  vector<int> get_2sat() {
    int n = int(g.size()) / 2;
    vector<int> comp = get_component();
    for (int i = (0); i < (n); ++i) {
      if (comp[2 * i] == comp[2 * i + 1]) {
        return {};
      }
    }
    int k = *max_element(comp.begin(), comp.end()) + 1;
    vector<vector<int>> Adj(k);
    vector<int> sizes(k);
    vector<int> todo;
    for (int i = (0); i < (2 * n); ++i) {
      for (auto& x : g[i]) {
        if (comp[i] != comp[x]) {
          Adj[comp[i]].push_back(comp[x]);
        }
      }
    }
    for (int i = (0); i < (int(g.size())); ++i) {
      g[i].clear();
      g[i].shrink_to_fit();
    }
    g.clear();
    g.shrink_to_fit();
    vector<int> ans;
    ans.resize(2 * n, -1);
    for (int i = (0); i < (n); ++i) {
      if (comp[2 * i] < comp[2 * i + 1])
        ans[2 * i] = false, ans[2 * i + 1] = 1;
      else
        ans[2 * i] = true, ans[2 * i + 1] = 0;
    }
    return ans;
  }
};
int n, p, M, m;
int main() {
  setIO("");
  cin >> p >> n >> M >> m;
  vector<vector<int>> adj(2 * (M + n) + 2);
  for (int i = (0); i < (p); ++i) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    x <<= 1, y <<= 1;
    adj[x + 1].push_back(y);
    adj[y + 1].push_back(x);
  }
  for (int i = (0); i < (n); ++i) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    x <<= 1, y <<= 1;
    x += 2 * n;
    y += 2 * n;
    adj[2 * i].push_back(x);
    adj[2 * i].push_back(y + 3);
    adj[x + 1].push_back(2 * i + 1);
    adj[y + 2].push_back(2 * i + 1);
  }
  for (int i = (1); i < (M); ++i) {
    int x = 2 * i + 2 * n;
    adj[x].push_back(x - 2);
  }
  for (int i = (0); i < (M - 1); ++i) {
    int x = 2 * i + 2 * n;
    adj[x + 1].push_back(x + 3);
  }
  for (int i = (0); i < (m); ++i) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    x <<= 1, y <<= 1;
    adj[x].push_back(y + 1);
    adj[y].push_back(x + 1);
  }
  scc graph;
  graph.init(adj);
  vector<int> ans = graph.get_2sat();
  if (!int(ans.size())) {
    cout << -1 << '\n';
    return 0;
  }
  int first = -1;
  for (int i = (0); i < (M + 1); ++i) {
    int x = 2 * i + 2 * n;
    if (ans[x + 1]) {
      first = i;
      break;
    }
  }
  if (first == -1) {
    cout << -1 << '\n';
    return 0;
  }
  vector<int> x;
  for (int i = (0); i < (n); ++i) {
    if (ans[2 * i]) {
      x.push_back(i);
    }
  }
  cout << int(x.size()) << " " << first << '\n';
  for (auto& a : x) cout << a + 1 << " ";
}
