#include <bits/stdc++.h>
using namespace std;
namespace output {
void __(short x) { cout << x; }
void __(unsigned x) { cout << x; }
void __(int x) { cout << x; }
void __(long long x) { cout << x; }
void __(unsigned long long x) { cout << x; }
void __(double x) { cout << x; }
void __(long double x) { cout << x; }
void __(char x) { cout << x; }
void __(const char* x) { cout << x; }
void __(const string& x) { cout << x; }
void __(bool x) { cout << (x ? "true" : "false"); }
template <class S, class T>
void __(const pair<S, T>& x) {
  __(1 ? "(" : ""), __(x.first), __(1 ? ", " : " "), __(x.second),
      __(1 ? ")" : "");
}
template <class T>
void __(const vector<T>& x) {
  __(1 ? "{" : "");
  bool _ = 0;
  for (const auto& v : x) __(_ ? 1 ? ", " : " " : ""), __(v), _ = 1;
  __(1 ? "}" : "");
}
template <class T>
void __(const set<T>& x) {
  __(1 ? "{" : "");
  bool _ = 0;
  for (const auto& v : x) __(_ ? 1 ? ", " : " " : ""), __(v), _ = 1;
  __(1 ? "}" : "");
}
template <class T>
void __(const multiset<T>& x) {
  __(1 ? "{" : "");
  bool _ = 0;
  for (const auto& v : x) __(_ ? 1 ? ", " : " " : ""), __(v), _ = 1;
  __(1 ? "}" : "");
}
template <class S, class T>
void __(const map<S, T>& x) {
  __(1 ? "{" : "");
  bool _ = 0;
  for (const auto& v : x) __(_ ? 1 ? ", " : " " : ""), __(v), _ = 1;
  __(1 ? "}" : "");
}
void pr() { cout << "\n"; }
template <class S, class... T>
void pr(const S& a, const T&... b) {
  __(a);
  if (sizeof...(b)) __(' ');
  pr(b...);
}
}  // namespace output
using namespace output;
const int MN = 1e5 + 5;
int n, m, sz, i, x, y, deg[MN], vis[MN][2], cmp[MN], st[MN], nxt, ans;
vector<int> adj[MN], cadj[MN];
deque<int> q;
stack<int> s;
queue<int> rep[MN];
inline bool qu(int x, int y) {
  printf("? %d %d\n", x, y);
  fflush(stdout);
  int r;
  scanf("%d", &r);
  if (r == -1)
    exit(0);
  else
    return r;
}
void dfs(int n) {
  vis[n][0] = vis[n][1] = ++nxt;
  st[n] = 1;
  s.push(n);
  for (auto v : adj[n]) {
    if (!vis[v][0])
      dfs(v), vis[n][1] = min(vis[n][1], vis[v][1]);
    else if (st[v])
      vis[n][1] = min(vis[n][1], vis[v][0]);
  }
  if (vis[n][0] == vis[n][1]) {
    rep[++sz].push(n);
    while (s.size() && s.top() != n) {
      cmp[s.top()] = sz;
      rep[sz].push(s.top());
      st[s.top()] = 0;
      s.pop();
    }
    cmp[s.top()] = sz;
    st[s.top()] = 0;
    s.pop();
  }
}
int main() {
  for (scanf("%d%d", &n, &m), i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    adj[x].push_back(y);
  }
  for (i = 1; i <= n; i++) {
    if (!vis[i][0]) dfs(i);
  }
  for (i = 1; i <= n; i++) {
    for (auto v : adj[i]) {
      if (cmp[v] != cmp[i]) {
        cadj[cmp[i]].push_back(cmp[v]);
        deg[cmp[v]]++;
      }
    }
  }
  for (i = 1; i <= sz; i++) {
    if (deg[i] == 0) q.push_back(i);
  }
  while (q.size() > 1) {
    x = q.front();
    q.pop_front();
    y = q.front();
    int cur = -1;
    if (qu(rep[x].front(), rep[y].front()) == 1) {
      rep[y].pop();
      if (rep[y].empty()) {
        q.pop_front();
        q.push_front(x);
        cur = y;
      } else
        q.push_front(x);
    } else {
      rep[x].pop();
      if (rep[x].empty()) {
        cur = x;
      } else
        q.push_front(x);
    }
    if (cur == -1) continue;
    for (auto v : cadj[cur]) {
      if (!(--deg[v])) q.push_back(v);
    }
  }
  printf("! %d\n", rep[q.front()].front());
  fflush(stdout);
  return 0;
}
