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
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i=a; i<=b; ++i)
#define pi pair<int, int>
#define f first
#define s second
#define eb emplace_back
#define pb push_back
#define sz(A) (int)(A.size())
const int maxn=3e4+7;
vector<int> conA[maxn], conB[maxn];
vector<pi> edgesA, edgesB;
map<pi, bool> isA, isB;
int n, ms, md;
vector<pair<int, pi>> odp;
bool vis[maxn];

void cadd(int a, int b) {
  odp.pb({1, {a, b}});
}

void cremove(int a, int b) {
  odp.pb({-1, {a, b}});
}

void dodaj_specjalne() {
  FOR(i, 2, n) {
    if(isA[{1, i}]) continue;
    if(isB[{1, i}]) conA[1].eb(i), conA[i].eb(1), isA[{1, i}]=1, isA[{i, 1}]=1, edgesA.pb({1, i});
    cadd(1, i);
  }
}

void dodaj_wymagane() {
  for(auto &[a, b] : edgesB) {
    if(isA[{a, b}]) continue;
    isA[{a, b}]=isA[{b, a}]=1;
    conA[a].eb(b);
    conA[b].eb(a);
    edgesA.pb({a, b});
    cadd(a, b);
  }
}

void usun_niepotrzebne() {
  for(auto &[a, b] : edgesA) {
    if(!isB[{a, b}] && min(a, b)==1) { isA[{a, b}]=isA[{b, a}]=0; continue; }
    if(isB[{a, b}] || min(a, b)==1) continue;
    isA[{a, b}]=isA[{b, a}]=0;
    cremove(a, b);
  }
}

void napraw_graf() {
  FOR(i, 1, n) {
    int j = 0;
    while(j<=sz(conA[i])-1) {
      int v = conA[i][j];
      if(isA[{i, v}]==0) {
        swap(conA[i][j], conA[i].back());
        conA[i].pop_back();
        --j;
      }
      ++j;
    }
  }
}

void dfs(int v) {
  vis[v]=1;
  for(int u : conA[v]) {
    if(vis[u]) continue;
    dfs(u);
  }

  if(isB[{1, v}] || v==1) return;
  cremove(1, v);  
}

void usun_specjalne() {
  dfs(1);
}

int main() {
  cin.tie(0) -> ios_base::sync_with_stdio(0);
  cin >> n;
  cin >> ms;
  int a, b;
  FOR(i, 1, ms) {
    cin >> a >> b;
    conA[a].eb(b);
    conA[b].eb(a);
    isA[{a, b}]=isA[{b, a}]=1;
    edgesA.pb({a, b});
  }
  cin >> md;
  FOR(i, 1, md) {
    cin >> a >> b;
    conB[a].eb(b);
    conB[b].eb(a);
    isB[{a, b}]=isB[{b, a}]=1;
    edgesB.pb({a, b});
  }

  dodaj_specjalne();
  dodaj_wymagane();
  usun_niepotrzebne();
  napraw_graf();
  usun_specjalne();

  cout << sz(odp) << '\n';
  for(auto &[typ, nodes] : odp) {
    if(typ==1) cout << "+ ";
    if(typ==-1) cout << "- ";
    cout << nodes.f << ' ' << nodes.s << '\n';
  }
}