#include <bits/stdc++.h>
struct Graph {
    int n;
    std::vector<std::vector<int>> neighbours;
    std::set<std::pair<int, int>> edges;
    std::vector<std::tuple<char, int, int>> operations;
    Graph(int _n) : n(_n), neighbours(n + 1) { }
    void read() {
        int m;
        std::cin >> m;
        while(m--) {
            int u, v;
            std::cin >> u >> v;
            neighbours[u].push_back(v);
            neighbours[v].push_back(u);
            edges.insert({u, v});
            edges.insert({v, u});
        }
    }
    void add_edge(int u, int v) {
        //assert(std::find(neighbours[u].begin(), neighbours[u].end(), v) == neighbours[u].end());
        //assert(std::find(neighbours[v].begin(), neighbours[v].end(), u) == neighbours[v].end());
        //neighbours[u].insert(v);
        //neighbours[v].insert(u);
        operations.push_back({'+', u, v});
    }
    void remove_edge(int u, int v) {
        //assert(std::find(neighbours[u].begin(), neighbours[u].end(), v) != neighbours[u].end());
        //assert(std::find(neighbours[v].begin(), neighbours[v].end(), u) != neighbours[v].end());
        //neighbours[u].erase(v);
        //neighbours[v].erase(u);
        operations.push_back({'-', u, v});
    }
    void dfs(int x, std::vector<bool>& processed) {
        processed[x] = true;
        if(x != 1 and edges.find({1, x}) == edges.end()) {
            add_edge(1, x);
        }
        for(int neighbour : neighbours[x]) {
            if(processed[neighbour])
                continue;
            dfs(neighbour, processed);
        }
    }
    void turn_into_1star() {
        // first add edges (1, x) for all x
        std::vector<bool> processed(n + 1, false);
        dfs(1, processed);
        // then erase all unwanted edges
        for(auto edge : edges) {
            if(edge.first < edge.second and edge.first != 1) {
                remove_edge(edge.first, edge.second);
            }
        }
    }
    void print() {
        for(auto t : operations) {
            std::cout << std::get<0>(t) << " " << std::get<1>(t) << " " << std::get<2>(t) << "\n";
        }
    }
    void print_in_reverse() {
        for(auto ptr = operations.rbegin(); ptr != operations.rend(); ptr++) {
            auto t = *ptr;
            std::cout << (std::get<0>(t)=='-' ? '+' : '-') << " " << std::get<1>(t) << " " << std::get<2>(t) << "\n";
        }
    }
};
int main() {
    int n;
    std::cin >> n;
    Graph G_startowy(n), G_docelowy(n);
    G_startowy.read();
    G_docelowy.read();
    G_startowy.turn_into_1star();
    G_docelowy.turn_into_1star();
    std::cout << (G_startowy.operations.size() + G_docelowy.operations.size()) << "\n";
    G_startowy.print();
    G_docelowy.print_in_reverse();
}
        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  | #include <bits/stdc++.h> struct Graph { int n; std::vector<std::vector<int>> neighbours; std::set<std::pair<int, int>> edges; std::vector<std::tuple<char, int, int>> operations; Graph(int _n) : n(_n), neighbours(n + 1) { } void read() { int m; std::cin >> m; while(m--) { int u, v; std::cin >> u >> v; neighbours[u].push_back(v); neighbours[v].push_back(u); edges.insert({u, v}); edges.insert({v, u}); } } void add_edge(int u, int v) { //assert(std::find(neighbours[u].begin(), neighbours[u].end(), v) == neighbours[u].end()); //assert(std::find(neighbours[v].begin(), neighbours[v].end(), u) == neighbours[v].end()); //neighbours[u].insert(v); //neighbours[v].insert(u); operations.push_back({'+', u, v}); } void remove_edge(int u, int v) { //assert(std::find(neighbours[u].begin(), neighbours[u].end(), v) != neighbours[u].end()); //assert(std::find(neighbours[v].begin(), neighbours[v].end(), u) != neighbours[v].end()); //neighbours[u].erase(v); //neighbours[v].erase(u); operations.push_back({'-', u, v}); } void dfs(int x, std::vector<bool>& processed) { processed[x] = true; if(x != 1 and edges.find({1, x}) == edges.end()) { add_edge(1, x); } for(int neighbour : neighbours[x]) { if(processed[neighbour]) continue; dfs(neighbour, processed); } } void turn_into_1star() { // first add edges (1, x) for all x std::vector<bool> processed(n + 1, false); dfs(1, processed); // then erase all unwanted edges for(auto edge : edges) { if(edge.first < edge.second and edge.first != 1) { remove_edge(edge.first, edge.second); } } } void print() { for(auto t : operations) { std::cout << std::get<0>(t) << " " << std::get<1>(t) << " " << std::get<2>(t) << "\n"; } } void print_in_reverse() { for(auto ptr = operations.rbegin(); ptr != operations.rend(); ptr++) { auto t = *ptr; std::cout << (std::get<0>(t)=='-' ? '+' : '-') << " " << std::get<1>(t) << " " << std::get<2>(t) << "\n"; } } }; int main() { int n; std::cin >> n; Graph G_startowy(n), G_docelowy(n); G_startowy.read(); G_docelowy.read(); G_startowy.turn_into_1star(); G_docelowy.turn_into_1star(); std::cout << (G_startowy.operations.size() + G_docelowy.operations.size()) << "\n"; G_startowy.print(); G_docelowy.print_in_reverse(); }  | 
            
        
                    English