#include <bits/stdc++.h>   using namespace std;   const int MAXN = 1010;   struct Modify {     bool add;     int a, b;   };   int n, m, t;   vector<int> x[MAXN];   map<int, int> h;   vector<int> s;   vector<Modify> ans;   int losestate[1 << 20];   int winstate[1 << 20];   void BuildBase() {     int out[MAXN];     vector<int> y[MAXN];     for (int i = 1; i <= n; ++i) {       out[i] = x[i].size();       y[i].clear();     }     for (int i = 1; i <= n; ++i) {       for (int b : x[i]) y[b].push_back(i);     }     queue<int> q;     for (int i = 1; i <= n; ++i) {       if (out[i] == 0) {         q.push(i);       }     }     while (!q.empty() && s.size() < 20) {       int a = q.front();       q.pop();       s.push_back(a);       h[a] = s.size() - 1;       for (int b : y[a]) {         --out[b];         if (out[b] == 0) q.push(b);       }     }     int z[20][20];     memset(z, 0, sizeof(z));     for (int i = 0; i < s.size(); ++i) {       for (int b : x[s[i]]) z[i][h[b]] = true;     }     for (int i = 0; i < s.size(); ++i) {       for (int j = 0; j < s.size(); ++j) {         if (z[i][j] && i <= j) {           ans.push_back({false, s[i], s[j]});         }         if (!z[i][j] && i > j) {           ans.push_back({true, s[i], s[j]});         }       }     }     for (int i = 0; i < s.size(); ++i) {       losestate[1 << i] = s[i];     }   }   void ModifyGraph() {     bool sz[1 << 20];     memset(sz, 0, sizeof(sz));     sz[0] = true;     for (int i = 1; i <= n; ++i) {       if (h.find(i) != h.end()) continue;       ans.push_back({true, i, i});       int state = 0;       for (int b : x[i]) {         if (h.find(b) == h.end()) continue;         state |= (1 << h[b]);       }       if (!sz[state]) {         sz[state] = true;         winstate[state] = i;         continue;       }       bool finished = false;       for (int p = 0; p < 20; ++p) {         int newst = state ^ (1 << p);         if (sz[newst]) continue;         finished = true;         sz[newst] = true;         winstate[newst] = i;         if (state & (1 << p)) {           ans.push_back({false, i, s[p]});         } else {           ans.push_back({true, i, s[p]});         }         if (finished) break;       }       if (finished) continue;       for (int p = 0; p < 20; ++p) {         for (int q = p + 1; q < 20; ++q) {           int newst = state ^ (1 << p) ^ (1 << q);           if (sz[newst]) continue;           finished = true;           sz[newst] = true;           winstate[newst] = i;           for (int o : {p, q}) {             if (state & (1 << o)) {               ans.push_back({false, i, s[o]});             } else {               ans.push_back({true, i, s[o]});             }           }           if (finished) break;         }         if (finished) break;       }       if (finished) continue;       for (int p = 0; p < 20; ++p) {         for (int q = p + 1; q < 20; ++q) {           for (int r = q + 1; r < 20; ++r) {             int newst = state ^ (1 << p) ^ (1 << q) ^ (1 << r);             if (sz[newst]) continue;             finished = true;             sz[newst] = true;             winstate[newst] = i;             for (int o : {p, q, r}) {               if (state & (1 << o)) {                 ans.push_back({false, i, s[o]});               } else {                 ans.push_back({true, i, s[o]});               }             }             if (finished) break;           }           if (finished) break;         }         if (finished) break;       }     }   }   int main() {     ios::sync_with_stdio(false);     cin >> n >> m >> t;     for (int i = 0; i < m; ++i) {       int a, b;       cin >> a >> b;       x[a].push_back(b);     }     BuildBase();     ModifyGraph();     cout << ans.size() << endl;     for (int i = 0; i < ans.size(); ++i) {       if (ans[i].add)         cout <<  +  ;       else         cout <<  -  ;       cout << ans[i].a <<     << ans[i].b << endl;     }     cout << flush;     while (t--) {       int win = 0, lose = 0, draw = 0;       for (int i = 0; i < s.size(); ++i) {         cout <<  ? 1   << s[i] << endl << flush;         string st;         cin >> st;         if (st ==  Win ) {           win |= (1 << i);         } else if (st ==  Lose ) {           lose |= (1 << i);         } else {           draw |= (1 << i);         }       }       int ans = 0;       if (lose > 0) {         ans = losestate[lose];       } else {         ans = winstate[win];       }       cout <<  !   << ans << endl << flush;       string st;       cin >> st;       if (st !=  Correct ) return 0;     }     return 0;   }