#include <bits/stdc++.h>
using namespace std;

#define f first
#define s second
#define pb push_back
#define siz(x) (int)x.size()

using ll=long long;
using ld=long double;
using pii=pair<int, int>;
using vi=vector<int>;

bool ckmin(auto&a, const auto&b) { return b<a?a=b,1:0; }
bool ckmax(auto&a, const auto&b) { return b>a?a=b,1:0; }

struct SCC{
	int n, CNT=0; vi comps; vector<vi> adj, radj, comp_adj, comp_radj; vi comp, vis; 
	SCC(int N): n(N){
		adj.resize(n), radj.resize(n); comp.resize(n), vis.resize(n);
	}
	SCC(){}
	void ae(int x, int y){
		adj[x].pb(y);
		radj[y].pb(x);
	}
	vi s;
	void dfs(int u){
		vis[u]=1; 
		for(auto&v:adj[u]) if(!vis[v]){
			dfs(v);
		}
		s.pb(u);
	}
	void dfs2(int u, int cc){
		vis[u]=1; 
		comp[u]=cc; 
		for(auto&v:radj[u]){
			if(!vis[v]){
				dfs2(v, cc);
			}
		}
	}
	void gen(){
		for(int i=0; i<n; i++) if(!vis[i]){
			dfs(i); 	
		}
		reverse(s.begin(), s.end()); 
		fill(vis.begin(), vis.end(), 0);
		for(auto u:s){
			if(!vis[u]){
				dfs2(u, CNT++);
				comps.pb(u);
			}
		}
		comp_adj.resize(CNT), comp_radj.resize(CNT);
		for(int i=0; i<n; i++){
			for(auto v:adj[i]) if(comp[v]!=comp[i]){
				comp_adj[comp[i]].pb(comp[v]);
				comp_radj[comp[v]].pb(comp[i]);
			}
		}
	}
};

SCC S; 
int n, p, M, m; 

void ae(int x, int y){
	S.ae(x^1, y); 
	S.ae(y^1, x); 
}

int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin >> n >> p >> M >> m; 
	S=SCC((p+M)*2); 
	for(int i=0; i<n; i++){
		int e1, e2; 
		cin >> e1 >> e2; 
		e1--; e2--; 
		ae(e1*2+1, e2*2+1); 
	}
	for(int i=0; i<p; i++){
		int L, R; 
		cin >> L >> R; 
		L--; R--; 
		// we either dont choose this guy or we say our bound >= L 
		ae(i*2, (L+p)*2+1); 
		if(R+1<p){
			// we either dont choose this guy or we dont say our bound is >= R
			ae(i*2, (R+p+1)*2); 
		}
	}
	for(int i=0; i<M-1; i++){
		// we either take take this first bound or we dont take this second bound 
		ae((i+p)*2+1, (i+p+1)*2); 
	}
	for(int i=0; i<m; i++){
		int e1, e2; 
		cin >> e1 >> e2; 
		e1--; e2--; 
		// we either dont take e1 or dont take e2; 
		ae(e1*2, e2*2); 
	}
	S.gen(); 
	int res=-1; vi ans;
	for(int i=0; i<(p+M); i++){
		if(S.comp[i*2]==S.comp[i*2+1]){
			cout << "-1\n"; 
			exit(0); 
		}
		else if(S.comp[i*2+1]>S.comp[i*2]){
			if(i<p) ans.pb(i); 
			else res=i-p;
		}
	}
	cout << siz(ans) << " " << res+1 << "\n"; 
	for(auto x:ans) 
		cout << x+1 << " ";
	cout << "\n"; 
	return 0; 
}