#include <bits/stdc++.h>
using namespace std;
int n, m;
int last[200007], other[200007], pre[200007], cnt = 0;
int a[200007], b[200007];
vector<int> g[200007];
int dfn[200007], low[200007], stk[200007], col[200007];
int d[200007];
bool vis[200007];
int tot, r, top;
int que[200007], num, size[200007];
void insert(int u, int v) {
  other[++cnt] = v, pre[cnt] = last[u], last[u] = cnt;
}
void tarjan(int x) {
  dfn[x] = ++tot, low[x] = tot;
  vis[x] = true;
  stk[++top] = x;
  for (int q = last[x]; q; q = pre[q]) {
    int v = other[q];
    if (!dfn[v]) {
      tarjan(v);
      low[x] = min(low[x], low[v]);
    } else if (vis[v])
      low[x] = min(low[x], dfn[v]);
  }
  if (dfn[x] == low[x]) {
    vis[x] = false;
    col[x] = ++r;
    while (stk[top] != x) {
      col[stk[top]] = r;
      vis[stk[top--]] = false;
    }
    --top;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &a[i], &b[i]);
    insert(a[i], b[i]);
  }
  for (int i = 1; i <= n; i++)
    if (!col[i]) tarjan(i);
  for (int i = 1; i <= n; i++) {
    ++size[col[i]];
    g[col[i]].push_back(i);
  }
  memset(last, 0, sizeof(last));
  memset(other, 0, sizeof(other));
  memset(pre, 0, sizeof(pre));
  cnt = 0;
  for (int i = 1; i <= m; i++)
    if (col[a[i]] != col[b[i]]) {
      ++d[col[b[i]]];
      insert(col[a[i]], col[b[i]]);
    }
  for (int i = 1; i <= r; i++)
    if (d[i] == 0) que[++num] = i;
  if (num == 1) {
    printf("! %d\n", g[que[1]][0]);
    fflush(stdout);
    return 0;
  }
  int pos = 1;
  for (int i = 2; i <= num; i++) {
    while (size[que[pos]] > 0 && size[que[i]] > 0) {
      printf("? %d %d\n", g[que[pos]][size[que[pos]] - 1],
             g[que[i]][size[que[i]] - 1]);
      fflush(stdout);
      int x;
      scanf("%d", &x);
      if (x == 1)
        --size[que[i]];
      else
        --size[que[pos]];
    }
    if (size[que[pos]] == 0) {
      for (int q = last[que[pos]]; q; q = pre[q]) {
        int v = other[q];
        --d[v];
        if (d[v] == 0) que[++num] = v;
      }
      pos = i;
    } else {
      for (int q = last[que[i]]; q; q = pre[q]) {
        int v = other[q];
        --d[v];
        if (d[v] == 0) que[++num] = v;
      }
    }
  }
  printf("! %d\n", g[que[pos]][size[que[pos]] - 1]);
  fflush(stdout);
  return 0;
}
