#include <bits/stdc++.h>
using std::min;
using std::vector;
const int MAXN = 1e6 + 20;
int first[MAXN], tote;
struct edge {
  int to, net;
} e[MAXN];
inline void clear_map() {
  tote = 0;
  memset(first, 0, sizeof(first));
}
inline void addedge(const int &u, const int &v) {
  ++tote;
  e[tote].to = v, e[tote].net = first[u];
  first[u] = tote;
}
vector<int> scc_list[MAXN];
int scc_id[MAXN], in[MAXN];
int dfn[MAXN], low[MAXN], cnt;
int stk[MAXN], stk_top;
bool instk[MAXN];
int times_dfs[MAXN], cnt_dfs;
int tmp_e_u2[MAXN], tmp_e_v2[MAXN], tmp_e_tot2;
void tarjan(int u) {
  times_dfs[u] = cnt_dfs;
  low[u] = dfn[u] = ++cnt;
  stk[stk_top++] = u;
  instk[u] = 1;
  for (int l = first[u]; l; l = e[l].net) {
    if (!dfn[e[l].to]) {
      tarjan(e[l].to);
      low[u] = min(low[u], low[e[l].to]);
    } else if (instk[e[l].to])
      low[u] = min(low[u], dfn[e[l].to]);
  }
  if (low[u] == dfn[u])
    while (stk[stk_top] != u) {
      scc_id[stk[stk_top - 1]] = u;
      instk[stk[stk_top - 1]] = 0;
      --stk_top;
    }
}
int tmp_e_u[MAXN], tmp_e_v[MAXN], tmp_e_tot;
void rebuild_DAG(int n) {
  for (int i = 1; i <= n; ++i)
    for (int l = first[i]; l; l = e[l].net)
      if (scc_id[e[l].to] != scc_id[i]) {
        tmp_e_u[tmp_e_tot] = i;
        tmp_e_v[tmp_e_tot] = e[l].to;
        ++tmp_e_tot;
      }
  clear_map();
  for (int i = 0; i < tmp_e_tot; ++i) {
    addedge(tmp_e_u[i], tmp_e_v[i]);
    ++in[tmp_e_v[i]];
  }
}
inline int read() {
  int x = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9')
    x = (x << 3) + (x << 1) + (48 ^ c), c = getchar();
  return x;
}
int top[MAXN], head, tail;
int in_top[MAXN];
int main() {
  int n = read(), m = read();
  for (int i = 0; i < m; ++i) {
    int u = read(), v = read();
    addedge(u, v);
  }
  for (int i = 1; i <= n; ++i)
    if (!dfn[i]) {
      cnt = 0;
      ++cnt_dfs;
      tarjan(i);
    }
  rebuild_DAG(n);
  for (int i = 1; i <= n; ++i)
    if (in[i] == 0) {
      if (!in_top[scc_id[i]]) {
        top[tail++] = i;
        in_top[scc_id[i]] = 1;
      } else
        scc_list[scc_id[i]].push_back(i);
    }
  while (tail - head > 1) {
    int u = top[head], v = top[head + 1];
    head += 2;
    printf("? %d %d\n", u, v);
    fflush(stdout);
    if (read() == 0) u ^= v ^= u ^= v;
    top[--head] = u;
    in_top[scc_id[v]] = 0;
    for (int l = first[v]; l; l = e[l].net) {
      --in[e[l].to];
      if (in[e[l].to] == 0) {
        if (!in_top[scc_id[e[l].to]]) {
          top[tail++] = e[l].to;
          in_top[scc_id[e[l].to]] = 1;
        } else
          scc_list[scc_id[e[l].to]].push_back(e[l].to);
      }
    }
    if ((int)scc_list[scc_id[v]].size() > 0) {
      top[tail++] = scc_list[scc_id[v]][scc_list[scc_id[v]].size() - 1];
      scc_list[scc_id[v]].pop_back();
      in_top[scc_id[v]] = 1;
    }
  }
  printf("! %d", top[head]);
}
