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
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

#define PB push_back
#define MP make_pair
#define F first
#define S second
#define ALL(x) (x).begin(),(x).end()
#define SIZE(x) (int)(x).size()
#define CLEAR(tab) memset(tab, 0, sizeof(tab))
#define REP(x, n) for(int x = 0; x < (n); x++)
#define FOR(x, b, e) for(int x = (b); x <= (e); x++)
#define FORD(x, b, e) for(int x = (b); x >= (e); x--)
#define VAR(v, n) __typeof(n) v = (n)
#define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define DEBUG(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)

typedef long long int LL;
typedef pair<int,int> PII;
typedef vector<int> VI;

const int MXN = 500000;
const int C = 262144;
const int INF = 1000000001;
const int MOD = 1000000007;

int n, m;

set<PII> EA, EB, Ecurr;
int mA, mB;
vector<int> GA[MXN], GB[MXN];
int vis[MXN];

pair<int, PII> res[MXN];
int cnt;

void dfsA(int x) {
	vis[x] = 1;

	if(x != 1 && Ecurr.find(MP(1, x)) == Ecurr.end()) {
		Ecurr.insert(MP(1, x));
		res[cnt++] = MP(1, MP(1, x));
	}

	FOREACH(it, GA[x])
		if(!vis[*it])
			dfsA(*it);
}

void dfsB(int x) {
	vis[x] = 1;

	FOREACH(it, GB[x])
		if(!vis[*it])
			dfsB(*it);

	if(x != 1 && Ecurr.find(MP(1, x)) != Ecurr.end() && EB.find(MP(1, x)) == EB.end()) {
		res[cnt++] = MP(-1, MP(1, x));
	}
}

void test() {
    scanf("%d", &n);
	scanf("%d", &mA);
	FOR(i, 1, mA) {
		int a, b;
		scanf("%d %d", &a, &b);
		if(a > b)
			swap(a, b);
		GA[a].PB(b);
		GA[b].PB(a);
		EA.insert(MP(a, b));
		Ecurr.insert(MP(a, b));
	}
	scanf("%d", &mB);
	FOR(i, 1, mB) {
		int a, b;
		scanf("%d %d", &a, &b);
		if(a > b)
			swap(a, b);
		GB[a].PB(b);
		GB[b].PB(a);
		EB.insert(MP(a, b));
	}

	dfsA(1);
	CLEAR(vis);
	FOREACH(it, EB) {
		PII p1 = *it;
		if(Ecurr.find(p1) == Ecurr.end()) {
			Ecurr.insert(p1);
			res[cnt++] = MP(1, p1);
		}
	}

	FOREACH(it, Ecurr) {
		PII p1 = *it;
		if(p1.F != 1 && EB.find(p1) == EB.end()) {
			res[cnt++] = MP(-1, p1);
		}
	}
	dfsB(1);

	printf("%d\n", cnt);
	FOR(i, 0, cnt - 1) {
		if(res[i].F == -1)
			printf("- ");
		else
			printf("+ ");
		printf("%d %d\n", res[i].S.F, res[i].S.S);
	}
}

int main() {
	int te = 1;
//	scanf("%d", &te);
	while(te--)
		test();
	return 0;
}