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
#include <bits/stdc++.h>

using namespace std;

//#define int long long

const int MAXN = 1e6 + 7;
const int INF = 1e9 + 7;

set<pair<int, int>> st1, st2;
vector<pair<int, int>> dodaj;
vector<pair<int, pair<int, int>>> usun;
set<pair<int, int>> unavailable;

set<int> G1[MAXN], G2[MAXN];


void solve(){
	
	int n, siz1, siz2, a, b, i;
	cin >> n >> siz1;

    for(i = 1; i <= siz1; i++){
    	
        cin >> a >> b;
        G1[a].insert(b);
        G1[b].insert(a);
    }
    
    cin >> siz2;

    for(i = 1; i <= siz2; i++){

        cin >> a >> b;
        G2[a].insert(b);
        G2[b].insert(a);
    }

    for(a = 1; a <= n; a++){

        for(b = a + 1; b <= n; b++){

            if(!G1[a].count(b)) unavailable.insert({a, b});
        }
    }

    for(i = 1; i <= n + 1; i++){

        vector<pair<int, int>> deletion;

        for(auto [a, b] : unavailable){

            for(int u : G1[b]){
            
                if(G1[a].count(u)){

                    deletion.push_back({a, b});
                    G1[a].insert(b);
                    G1[b].insert(a);
                    dodaj.push_back({a, b});
                    break;
                }
            }
        }

        for(auto [a, b] : deletion) unavailable.erase({a, b});
    }

    for(a = 1; a <= n; a++){

        vector<int> dist(n + 1, INF);
        queue<int> q;
        q.push(a);
        dist[a] = 0;

        while(!q.empty()){

            int b = q.front();
            q.pop();

            for(auto u : G2[b]){
            
                if(dist[u] >= INF){

                    dist[u] = dist[b] + 1;
                    q.push(u);
                }
            }
        }

        for(b = a + 1; b <= n; b++){

            if(dist[b] > 1) usun.push_back({dist[b], {a, b}});
        }
    }

    sort(usun.begin(), usun.end());
	reverse(usun.begin(), usun.end());

    int ile = dodaj.size() + usun.size();
    cout << ile << '\n';
    
    for(auto [a, b] : dodaj) cout << "+ " << a << ' ' << b << '\n';
    for(auto [d, u] : usun) cout << "- " << u.first << ' ' << u.second << '\n';
}



signed main(){
	
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	int t = 1;
	//cin >> t;
	
	while(t--) solve();	
	
	return 0;
}