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
#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>, bool>mapa, docelowe;
vector<int>graf1[30010], graf2[30010];
bool odw[30010];
vector<pair<bool, pair<int,int>>>kra;
void polacz(int a, int b){
	if(mapa[{a,b}])return;
	kra.push_back({1, {a,b}});
	mapa[{a,b}] = 1;
	mapa[{b,a}] = 1;
}
void usun(int a, int b){
	if(mapa[{a,b}]){
		mapa[{a,b}] = 0;
		mapa[{b,a}] = 0;
		kra.push_back({0, {a,b}});
	}
}
void dfs1(int x){
	odw[x] = 1;
	if(x!=1)
		polacz(1, x);
	for(auto j: graf1[x])
		if(!odw[j])
			dfs1(j);
}
void dfs2(int x){
	odw[x] = 0;
	for(auto j: graf2[x])
		if(odw[j])
			dfs2(j);
	if(x!=1 && !docelowe[{x,1}])kra.push_back({0,{1, x}});
}

int main()
{
	int n, m, i, a, b;
	scanf("%d", &n);
	scanf("%d", &m);
	for(i=0;i<m;i++){
		scanf("%d%d", &a, &b);
		graf1[a].push_back(b);
		graf1[b].push_back(a);
		mapa[{a,b}] = 1;
		mapa[{b,a}] = 1;
	}
	dfs1(1);//polacz wszystkie z 1
	for(auto j: mapa){//usun wszystkie krawedzie
		if(j.first.first!=1 && j.first.second!=1)
			usun(j.first.first, j.first.second);
	}
	scanf("%d", &m);
	for(i=0;i<m;i++){
		scanf("%d%d", &a, &b);
		docelowe[{a,b}] = 1;
		docelowe[{b,a}] = 1;
		graf2[a].push_back(b);
		graf2[b].push_back(a);
		if(a!=1 && b!=1)
			kra.push_back({1, {a,b}});
	}
	dfs2(1);
	printf("%d\n", (int)kra.size());
	for(auto j: kra){
		if(j.first==1)printf("+ ");
		else printf("- ");
		printf("%d %d\n", j.second.first, j.second.second);
	}
}