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

using namespace std;

#define endl '\n'
#define L long long
#define MP make_pair
#define REP(i, n) for(int i = 0; i < n; ++i)
#define REPR(i, n) for(int i = n - 1; i >= 0; --i)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define FORR(i, a, b) for(int i = b - 1; i >= a; --i)
#define EB emplace_back
#define ST first
#define ND second
#define S size
#define RS resize

template<class T> using P = pair<T, T>;
template<class T> using V = vector<T>;

V<unordered_set<int>> g1, g2;
V<bool> has_e1, has_e2, vis;
V<tuple<char, int, int>> res;

void dfs_add_e1(int v) {
    vis[v] = true;

    if (v != 0 && !has_e1[v]) {
        res.EB('+', 0, v);
    }

    for (int u : g1[v]) {
        if (!vis[u]) {
            dfs_add_e1(u);
        }
    }
}

void dfs_del_e1(int v) {
    vis[v] = true;

    for (int u : g2[v]) {
        if (!vis[u]) {
            dfs_del_e1(u);
        }
    }

    if (v != 0 && !has_e2[v]) {
        res.EB('-', 0, v);
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin >> n;

    g1.RS(n);
    g2.RS(n);
    has_e1.RS(n);
    has_e2.RS(n);
    vis.RS(n);

    int ms;
    cin >> ms;
    REP(i, ms) {
        int a, b;
        cin >> a >> b;
        a--, b--;
        if (a > b) {
            swap(a, b);
        }
        if (a == 0) {
            has_e1[b] = true;
        }
        g1[a].insert(b), g1[b].insert(a);
    }

    int md;
    cin >> md;
    REP(i, md) {
        int a, b;
        cin >> a >> b;
        a--, b--;
        if (a > b) {
            swap(a, b);
        }
        if (a == 0) {
            has_e2[b] = true;
        }
        g2[a].insert(b), g2[b].insert(a);
    }

    dfs_add_e1(0);

    fill(vis.begin(), vis.end(), false);

    FOR(v, 1, n) {
        for (int u : g1[v]) {
            if (v < u && !g2[v].contains(u)) {
                res.EB('-', v, u);
            }
        }
    }

    FOR(v, 1, n) {
        for (int u : g2[v]) {
            if (v < u && !g1[v].contains(u)) {
                res.EB('+', v, u);
            }
        }
    }

    dfs_del_e1(0);

    cout << res.size() << '\n';
    for (auto& [c, v, u] : res) {
        cout << c << ' ' << v + 1 << ' ' << u + 1 << '\n';
    }
}