1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<bits/stdc++.h>

using namespace std;

const int N = 3e4 + 5;

class info{
public:
	int p, u, v;
	inline info() {}
	inline info(int p0, int u0, int v0){
		p = p0, u = u0, v = v0;
	}
};

int n = 0, m1 = 0, m2 = 0, fa[N] = {}, vis[N] = {}, vis1[N] = {}, vis2[N] = {};
vector<vector<int> > G1(N), G2(N);
vector<info> ans;

inline void dfs1(int u){
	if(u > 1 && !vis1[u]) ans.push_back(info(1, 1, u));
	vis[u] = 1;
	for(int v : G1[u]) if(!vis[v]) dfs1(v);
}

inline void dfs2(int u){
	vis[u] = 1;
	for(int v : G2[u]) if(!vis[v]) dfs2(v);
	if(u > 1 && !vis2[u]) ans.push_back(info(0, 1, u));
}

int main(){
	scanf("%d", &n);
	scanf("%d", &m1);
	for(int i = 1, u = 0, v = 0 ; i <= m1 ; i ++){
		scanf("%d %d", &u, &v);
		G1[u].push_back(v), G1[v].push_back(u);
		if(min(u, v) == 1) vis1[max(u, v)] = 1;
	}
	scanf("%d", &m2);
	for(int i = 1, u = 0, v = 0 ; i <= m2 ; i ++){
		scanf("%d %d", &u, &v);
		G2[u].push_back(v), G2[v].push_back(u);
		if(min(u, v) == 1) vis2[max(u, v)] = 1;
	}
	memset(vis, 0, sizeof(vis)), dfs1(1);
	for(int u = 2 ; u <= n ; u ++) for(int v : G1[u]) if(u < v) ans.push_back(info(0, u, v));
	for(int u = 2 ; u <= n ; u ++) for(int v : G2[u]) if(u < v) ans.push_back(info(1, u, v));
	memset(vis, 0, sizeof(vis)), dfs2(1);
	printf("%d\n", int(ans.size()));
	for(auto bag : ans){
		int p = bag.p, u = bag.u, v = bag.v;
		if(p) printf("+ %d %d\n", u, v);
		else printf("- %d %d\n", u, v);
	}
	return 0;
}