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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <bits/stdc++.h>

using namespace std;
constexpr int M = 30'005;
struct odp{
	char znak;
	int a, b;	
};

set<pair<int, int>> sk;
set<pair<int, int>> s;
vector<vector<int>> g(M);
vector<vector<int>> g2(M);
vector<int> preorder;
bool odw[M];
vector<odp> odpowiedzi;
vector<pair<int, int>> dodatkowo;
void dfs(int v){
	odw[v] = 1;
	preorder.push_back(v);
	for(auto i:g[v]) if(!odw[i]) dfs(i);
}
void dfs2(int v){
	odw[v] = 1;
	preorder.push_back(v);
	for(auto i:g2[v]) if(!odw[i]) dfs2(i);
}


int main(){
	cin.tie(0)->sync_with_stdio(0);
	int n, m;
	cin>>n>>m;
	for(int i=1; i<=m; i++){
		int a, b;
		cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
		dodatkowo.push_back({a, b});
		sk.insert({a, b});
		sk.insert({b, a});
	}
	dfs(1);
	for(int i=1; i<preorder.size(); i++){
		int akt = preorder[i];
		if(sk.count({1, akt})==0){
			odpowiedzi.push_back({'+', 1, akt});
			sk.insert({1, akt});
			sk.insert({akt, 1});
		}
	}
	cin>>m;
	for(int i=1; i<=m; i++){
		int a, b;
		cin>>a>>b;
		s.insert({a, b});
		s.insert({b, a});
		if(sk.count({a, b})==0){	
			odpowiedzi.push_back({'+', a, b});
			g2[a].push_back(b);
			g2[b].push_back(a);
		}
	}
	
	for(auto i:dodatkowo){
		if(i.first!=1 && i.second!=1){
			if(s.count({i.first, i.second})==0){
				odpowiedzi.push_back({'-', i.first, i.second});
			}
		}
	}
	for(auto i:s) g2[i.first].push_back(i.second);
	preorder.clear();
	for(int i=1; i<=n; i++) odw[i] = 0;
	dfs2(1);
	reverse(preorder.begin(), preorder.end());
	for(auto i:preorder) if(i!=1){
		if(s.count({1, i})==0){
			odpowiedzi.push_back({'-', 1, i});
		}
	}
	cout<<odpowiedzi.size()<<endl;
	for(auto i:odpowiedzi) cout<<i.znak<<" "<<i.a<<" "<<i.b<<endl;
	return 0;
}