#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000;
bool ask(int u, int v) {
  cout << "? " << u + 1 << ' ' << v + 1 << endl;
  bool ans;
  cin >> ans;
  return ans;
}
bool ans(int x) {
  cout << "! " << x + 1 << endl;
  exit(0);
}
int n, m;
vector<int> g[maxn], rg[maxn], f[maxn], v[maxn];
set<int> bitch[maxn];
stack<int> stac;
int fuck[maxn], cmn[maxn], sz[maxn];
bool used[maxn];
int cc = 0, tmr = 0;
void top_sort(int x) {
  used[x] = 1;
  for (int i = 0; i < g[x].size(); i++) {
    int to = g[x][i];
    if (used[to]) continue;
    top_sort(to);
  }
  stac.push(x);
}
void dfs1(int x) {
  cmn[x] = cc;
  for (int i = 0; i < rg[x].size(); i++) {
    int to = rg[x][i];
    if (cmn[to] != -1) continue;
    dfs1(to);
  }
}
void dfs2(int x) {
  used[x] = 1;
  for (int i = 0; i < g[x].size(); i++) {
    int to = g[x][i];
    if (cmn[x] != cmn[to]) bitch[cmn[x]].insert(cmn[to]);
    if (used[to]) continue;
    dfs2(to);
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    --u;
    --v;
    g[u].push_back(v);
    rg[v].push_back(u);
  }
  for (int i = 0; i < n; i++)
    if (!used[i]) {
      int pt = tmr;
      top_sort(i);
    }
  for (int i = 0; i < n; i++) {
    fuck[i] = stac.top();
    stac.pop();
  }
  tmr = 0;
  for (int i = 0; i < n; i++) {
    cmn[i] = -1;
    used[i] = 0;
  }
  for (int i = 0; i < n; i++)
    if (cmn[fuck[i]] == -1) {
      dfs1(fuck[i]);
      ++cc;
    }
  for (int i = 0; i < n; i++) {
    if (!used[i]) dfs2(i);
  }
  for (int i = 0; i < cc; i++)
    for (auto gg : bitch[i]) {
      f[i].push_back(gg);
    }
  set<int> st;
  for (int i = 0; i < cc; i++)
    for (int j = 0; j < f[i].size(); j++) ++sz[f[i][j]];
  for (int i = 0; i < cc; i++)
    if (sz[i] == 0) st.insert(i);
  for (int i = 0; i < n; i++) v[cmn[i]].push_back(i);
  int root = v[(*st.begin())][0];
  while (st.size() > 1) {
    int x = (*st.begin());
    st.erase(st.begin());
    int y;
    if (x == cmn[root]) {
      y = (*st.begin());
      st.insert(x);
    } else {
      y = cmn[root];
      st.insert(x);
      swap(x, y);
    }
    int p1 = 0, p2 = 0;
    while (p1 < v[x].size() && p2 < v[y].size()) {
      int u1 = v[x][p1], u2 = v[y][p2];
      bool flg = 0;
      if (cmn[root] != x) {
        swap(u1, u2);
        flg = 1;
      }
      bool aut = ask(u2, u1);
      if (flg) swap(u1, u2);
      if (aut) {
        if (root == u2) {
          root = u1;
          ++p2;
        } else {
          root = u2;
          ++p1;
        }
      } else {
        if (root == u1)
          ++p2;
        else
          ++p1;
      }
    }
    int anus = (cmn[root] == x ? y : x);
    for (int i = 0; i < f[anus].size(); i++) {
      int to = f[anus][i];
      --sz[to];
      if (sz[to] == 0) st.insert(to);
    }
    st.erase(anus);
  }
  ans(root);
  return 0;
}
