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
#include <iostream>
#include <set>
#include <vector>
std::set<std::pair<int,int> > cr;
struct Q{
    bool t;
    int a, b;
    Q(bool t2, int a2, int b2):t{t2}, a{a2}, b{b2}{}
};
std::vector<Q> q;
void add(int a, int b){
    if (cr.find(std::make_pair(std::min(a,b),std::max(a,b)))==cr.end()){
        cr.emplace(std::min(a,b),std::max(a,b));
        q.emplace_back(true,a,b);
    }
}

void rem(int a, int b){
    cr.erase(std::make_pair(std::min(a,b),std::max(a,b)));
    q.emplace_back(false,a,b);
}

void dfs1(std::vector<int>* t, bool* vis, int start){
    vis[start]=true;
    if (start!=1)add(1,start);
    for (auto a:t[start]){
        if(!vis[a])dfs1(t,vis,a);
    }
}

void dfs2(std::vector<int>* t, bool* vis, bool* one_sas, int start){
    //std::cout<<start<<'\n';
    vis[start]=true;
    for (auto a:t[start]){
        if(!vis[a])dfs2(t,vis,one_sas,a);
    }
    if (!one_sas[start] and start!=1)rem(1,start);
}

int main(){
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);
    int n;
    std::cin>>n;
    {
        int s;
        std::cin>>s;
        std::vector<int> t[n+1];
        bool vis[n+1];
        for (size_t i=1; i<=n; ++i)vis[i]=false;
        for (size_t i=0; i<s; ++i){
            int a, b;
            std::cin>>a>>b;
            cr.emplace(std::min(a,b),std::max(a,b));
            t[a].push_back(b);
            t[b].push_back(a);
        }
        dfs1(t,vis,1);
        //dodane 1->wszystko +30k
    }
    {
        std::vector<std::pair<int,int> > tmp;
        for (auto a:cr){
            if (a.first!=1 and a.second!=1)tmp.push_back(a);
        }
        for (auto a:tmp)rem(a.first,a.second);
        //tylko 1->wszystko +50k
    }
    {
        int s;
        std::cin>>s;
        std::vector<int> t[n+1];
        bool vis[n+1], one_sas[n+1];
        for (size_t i=1; i<=n; ++i)vis[i]=false, one_sas[i]=false;
        for (size_t i=0; i<s; ++i){
            int a, b;
            std::cin>>a>>b;
            if (a==1)one_sas[b]=true;
            if (b==1)one_sas[a]=true;
            add(a,b);
            t[a].push_back(b);
            t[b].push_back(a);
        }
        // 1->wszystko + to co ma byc +50k
        dfs2(t,vis,one_sas,1);
        // to co ma byc +30k
    }
    std::cout<<q.size()<<'\n';
    for (auto a:q){
        if (a.t){
            std::cout<<'+'<<' '<<a.a<<' '<<a.b<<'\n';
        }else{
            std::cout<<'-'<<' '<<a.a<<' '<<a.b<<'\n';
        }
    }
}