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

using namespace std;

#define ALL(x) (x).begin(), (x).end()

template<class C> void mini(C &a5, C b5) { a5 = min(a5, b5); }
template<class C> void maxi(C &a5, C b5) { a5 = max(a5, b5); }

#ifdef LOCAL
const bool debug = true;
#else
const bool debug = false;
#define cerr if (true) {} else cout
#endif
// clang-format on

// #define int long long
// #define double long double

// const int INF = 1e18;
const int mod = 1e9 + 7;

struct AnswerLine {
    bool add;
    int x, y;
};

struct Solver {
    int n;
    vector<vector<int>> adj;
    vector<bool> vis;
    vector<AnswerLine> answer;

    Solver(int n_) : n(n_), adj(n_ + 1), vis(n_ + 1) {
        int m;
        cin >> m;

        while (m--) {
            int u, v;
            cin >> u >> v;
            adj[u].push_back(v);
            adj[v].push_back(u);

            if (u != 1 && v != 1)
                answer.push_back({false, u, v});
        }

        dfs();
    }

    void dfs(int v = 1) {
        bool adj_of_1 = (v == 1);
        vis[v] = true;

        for (int u : adj[v]) {
            adj_of_1 |= (u == 1);
            if (vis[u])
                continue;
            dfs(u);
        }

        if (!adj_of_1)
            answer.push_back({true, 1, v});
    }

    void print(bool rev = false) {
        if (!rev)
            reverse(ALL(answer));

        for (auto [add, x, y] : answer) {
            add ^= rev;
            cout << (add ? "+ " : "- ") << x << ' ' << y << '\n';
        }

        if (!rev)
            reverse(ALL(answer));
    }
};

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

    int n;
    cin >> n;
    Solver s1(n), s2(n);

    cout << s1.answer.size() + s2.answer.size() << '\n';
    s1.print();
    s2.print(true);

    return 0;
} /*

 */