#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010, mod = 998244353;
inline long long read() {
  char ch = getchar();
  long long x = 0, f = 0;
  while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return f ? -x : x;
}
int n, m, dfn[maxn], low[maxn], stk[maxn], tp, cnt, id[maxn], deg[maxn], scnt,
    el, head[maxn], to[maxn], nxt[maxn], ans, q[maxn], h = 1, r;
bool ins[maxn];
vector<int> vec[maxn];
inline int ask(int u, int v) {
  printf("? %d %d\n", u, v);
  fflush(stdout);
  return read();
}
inline void add(int u, int v) {
  to[++el] = v;
  nxt[el] = head[u];
  head[u] = el;
}
void dfs(int u) {
  dfn[u] = low[u] = ++cnt;
  stk[++tp] = u;
  ins[u] = true;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (!dfn[v])
      dfs(v), low[u] = min(low[u], low[v]);
    else if (ins[v])
      low[u] = min(low[u], dfn[v]);
  }
  if (low[u] == dfn[u]) {
    scnt++;
    do {
      int v = stk[tp];
      ins[v] = false;
      id[v] = scnt;
      vec[scnt].push_back(v);
    } while (stk[tp--] != u);
  }
}
int main() {
  n = read();
  m = read();
  for (int i = (1); i <= (m); i++) {
    int u = read(), v = read();
    add(u, v);
  }
  for (int i = (1); i <= (n); i++)
    if (!dfn[i]) dfs(i);
  for (int u = (1); u <= (n); u++)
    for (int i = head[u]; i; i = nxt[i])
      if (id[u] != id[to[i]]) deg[id[to[i]]]++;
  for (int i = (1); i <= (scnt); i++)
    if (!deg[i]) q[++r] = i;
  ans = vec[q[h]].back();
  while (h != r) {
    int &at = q[h + 1];
    int u = vec[at].back();
    if (!ask(ans, u)) swap(u, ans), swap(q[h], q[h + 1]);
    for (int i = head[u]; i; i = nxt[i])
      if (id[u] != id[to[i]] && !--deg[id[to[i]]]) q[++r] = id[to[i]];
    vec[at].pop_back();
    if (vec[at].empty()) swap(q[h], q[h + 1]), h++;
  }
  printf("! %d\n", ans);
  fflush(stdout);
}
