// ALC: Alchemik Bajtazar [B] | 2024-03-12 | Solution by dkgl
// https://sio2.mimuw.edu.pl/c/pa-2024-1/p/alc/
#include <bits/stdc++.h>
using namespace std;
struct Node {
  vector<int> neighbours;
  bool visited = false;
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  cin >> n;
  vector<Node> nodes(n);
  set<pair<int, int>> remaining_edges;
  auto add_edge = [&](int a, int b) {
    if (a > b) swap(a, b);
    nodes[a].neighbours.push_back(b);
    nodes[b].neighbours.push_back(a);
    remaining_edges.insert({ a, b });
  };
  int m_start;
  cin >> m_start;
  while (m_start--) {
    int a, b;
    cin >> a >> b;
    --a; --b;
    add_edge(a, b);
  }
  queue<int> queue;
  auto &root = nodes[0];
  root.visited = true;
  for (auto u: root.neighbours) {
    nodes[u].visited = true;
    queue.push(u);
  }
  vector<pair<int, int>> added_edges;
  while (!queue.empty()) {
    auto v = queue.front();
    queue.pop();
    for (auto u: nodes[v].neighbours) {
      if (nodes[u].visited) continue;
      nodes[u].visited = true;
      queue.push(u);
      add_edge(0, u);
      added_edges.push_back({ 0, u });
    }
  }
  int m_final;
  cin >> m_final;
  while (m_final--) {
    int a, b;
    cin >> a >> b;
    --a; --b;
    if (a > b) swap(a, b);
    auto el = remaining_edges.find({ a, b });
    if (el == remaining_edges.end()) added_edges.push_back({ a, b });
    else remaining_edges.erase(el);
  }
  cout << added_edges.size() + remaining_edges.size() << '\n';
  for (auto &[a, b]: added_edges) cout << "+ " << a + 1 << ' ' << b + 1 << '\n';
  for (auto &[a, b]: remaining_edges) cout << "- " << a + 1 << ' ' << b + 1 << '\n';
  cout.flush();
  return 0;
}
        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  | // ALC: Alchemik Bajtazar [B] | 2024-03-12 | Solution by dkgl // https://sio2.mimuw.edu.pl/c/pa-2024-1/p/alc/ #include <bits/stdc++.h> using namespace std; struct Node { vector<int> neighbours; bool visited = false; }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<Node> nodes(n); set<pair<int, int>> remaining_edges; auto add_edge = [&](int a, int b) { if (a > b) swap(a, b); nodes[a].neighbours.push_back(b); nodes[b].neighbours.push_back(a); remaining_edges.insert({ a, b }); }; int m_start; cin >> m_start; while (m_start--) { int a, b; cin >> a >> b; --a; --b; add_edge(a, b); } queue<int> queue; auto &root = nodes[0]; root.visited = true; for (auto u: root.neighbours) { nodes[u].visited = true; queue.push(u); } vector<pair<int, int>> added_edges; while (!queue.empty()) { auto v = queue.front(); queue.pop(); for (auto u: nodes[v].neighbours) { if (nodes[u].visited) continue; nodes[u].visited = true; queue.push(u); add_edge(0, u); added_edges.push_back({ 0, u }); } } int m_final; cin >> m_final; while (m_final--) { int a, b; cin >> a >> b; --a; --b; if (a > b) swap(a, b); auto el = remaining_edges.find({ a, b }); if (el == remaining_edges.end()) added_edges.push_back({ a, b }); else remaining_edges.erase(el); } cout << added_edges.size() + remaining_edges.size() << '\n'; for (auto &[a, b]: added_edges) cout << "+ " << a + 1 << ' ' << b + 1 << '\n'; for (auto &[a, b]: remaining_edges) cout << "- " << a + 1 << ' ' << b + 1 << '\n'; cout.flush(); return 0; }  | 
            
        
                    English