#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;
}
