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
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define fi first
#define se second
#define pn printf("\n")
#define ssize(x) int(x.size())
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define bitcount(x) __builtin_popcount(x)
#define clz(x) __builtin_clz(x)
#define ctz(x) __builtin_ctz(x)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef double db;
typedef long double ldb;
#define vv vector
/*void read(int &a){
		char c = getchar_unlocked(); a = 0;
		while(c<'0' || '9'<c) c = getchar_unlocked();
		while('0'<=c&&c<='9') a = (a<<3)+(a<<1)+c-'0', c = getchar_unlocked();
}*/
int inf = 2e09; ll infll = 2e18; int mod = (1<<23)*119+1;
int add(int a, int b){return a+b >= mod ? a+b - mod : a+b;}
int sub(int a, int b){return a-b < 0 ? a-b + mod : a-b;}
int mul(int a, int b){return int(a * ll(b) % mod);}
int fpow(int a, int b){
		int ret = 1;
		while(b){
				if(b & 1) ret = mul(ret, a);
				b >>= 1, a = mul(a, a);
		} return ret;
}
int inv(int a){ return fpow(a, mod-2); }
int coeff(int n, int k, vector<int> &fac, vector<int> &invfac){
		if(n < k) return 0;
		return mul(fac[n], mul(invfac[n-k], invfac[k]));
}
void calcfac(int n, vector<int> &fac, vector<int> &invfac){
		fac[0] = 1, invfac[0] = 1;
		for(int i = 1; i <= n; ++i) fac[i] = mul(fac[i-1], i);
		invfac[n] = inv(fac[n]);
		for(int i = n-1; i; --i) invfac[i] = mul(invfac[i+1], i+1);
}
struct graph{
		vv<vv<int>> g;
		vv<int> dist;
		void init(int n){
				g.resize(n+1), dist.resize(n+1, 0);
		}
		void add_edge(int a, int b){ g[a].emplace_back(b), g[b].emplace_back(a); }
		vv<int> bfs(){
				vv<int> out;
				queue<int> q; q.emplace(1); dist[1] = 1;
				while(ssize(q)){
						int x = q.front(); q.pop();
						if(dist[x] > 2) out.emplace_back(x);
						for(int &u : g[x]) if(!dist[u]) q.emplace(u), dist[u] = dist[x]+1;
				}
				return out;
		}
};
struct st{
		char c; int a, b;
		st(){}
		st(char cc, int aa, int bb){ c = cc, a = aa, b = bb; }
};
void answer(){
		int n, m1, m2; scanf("%d%d", &n, &m1);
		map<pii, int> mp1, mp2;
		graph g1, g2; g1.init(n), g2.init(n);
		vv<pii> e_list1, e_list2;
		for(int i = 0; i < m1; ++i){
				int a, b; scanf("%d%d", &a, &b);
				if(a > b) swap(a, b);
				g1.add_edge(a, b), mp1[pii(a, b)] = 1, e_list1.emplace_back(a, b);
		}
		scanf("%d", &m2);
		for(int i = 0; i < m2; ++i){
				int a, b; scanf("%d%d", &a, &b);
				if(a > b) swap(a, b);
				g2.add_edge(a, b), mp2[pii(a, b)] = 1, e_list2.emplace_back(a, b);
		}
		vv<int> out1 = g1.bfs(), out2 = g2.bfs();;
		reverse(all(out2));
		vv<st> out;
		for(int u : out1) out.emplace_back('+', 1, u), mp1[pii(1, u)] = 1;
		for(int u : out2) mp2[pii(1, u)] = 1;
		for(pii u : e_list1) if(!mp2[u]) out.emplace_back('-', u.fi, u.se);
		for(pii u : e_list2) if(!mp1[u]) out.emplace_back('+', u.fi, u.se);
		for(int u : out2) out.emplace_back('-', 1, u);
		printf("%d\n", ssize(out));
		for(st &u : out) printf("%c %d %d\n", u.c, u.a, u.b);
		pn;
}
signed main(){
		int T = 1;
		//~ scanf("%d", &T);
		//~ ios_base::sync_with_stdio(0); cin.tie(0); //cin >> T;
		for(++T; --T; ) answer();
		return 0;
}