#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma,tune=native")
template <typename T>
void print(T&& x) {
  cout << x << "\n";
}
template <typename T, typename... S>
void print(T&& x, S&&... y) {
  cout << x << ' ';
  print(y...);
}
const long long Mod = 1000000007, Mod2 = 998244353;
const long long MOD = Mod2;
const long long maxn = 100005;
long long n, m, scc[maxn], cnt, in[maxn];
vector<long long> adj[maxn], radj[maxn], ord, vec[maxn], adj2[maxn];
bool vis[maxn];
set<long long> st;
void rdfs(long long u) {
  vis[u] = 1;
  for (auto v : radj[u])
    if (!vis[v]) rdfs(v);
  ord.push_back(u);
}
void dfs(long long u) {
  vis[u] = 1;
  scc[u] = cnt;
  vec[cnt].push_back(u);
  for (auto v : adj[u])
    if (!vis[v]) dfs(v);
}
bool query(long long u, long long v) {
  print("?", u + 1, v + 1);
  cout << flush;
  long long x;
  cin >> x;
  return x;
}
void orzck() {
  cin >> n >> m;
  for (long long i = (0); i < ((long long)(m)); i++) {
    long long u, v;
    cin >> u >> v;
    u--, v--;
    adj[u].push_back(v), radj[v].push_back(u);
  }
  for (long long i = (0); i < ((long long)(n)); i++)
    if (!vis[i]) rdfs(i);
  reverse(ord.begin(), ord.end());
  memset(vis, 0, sizeof vis);
  for (auto i : ord)
    if (!vis[i]) dfs(i), cnt++;
  for (long long i = (0); i < ((long long)(cnt)); i++)
    for (long long j = (0); j < ((long long)(((long long)vec[i].size()) - 1));
         j++)
      adj2[vec[i][j]].push_back(vec[i][j + 1]), in[vec[i][j + 1]]++;
  for (long long i = (0); i < ((long long)(n)); i++)
    for (auto j : adj[i])
      if (scc[j] != scc[i])
        adj2[vec[scc[i]].back()].push_back(vec[scc[j]][0]),
            in[vec[scc[j]][0]]++;
  for (long long i = (0); i < ((long long)(n)); i++)
    if (!in[i]) st.insert(i);
  long long x = *st.begin();
  while (((long long)st.size()) >= 2) {
    st.erase(x);
    long long y = *st.begin();
    st.insert(x);
    if (!query(x, y)) swap(x, y);
    st.erase(y);
    for (auto i : adj2[y]) {
      in[i]--;
      if (!in[i]) st.insert(i);
    }
  }
  print("!", x + 1);
}
signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cout << fixed << setprecision(15);
  long long t;
  t = 1;
  while (t--) orzck();
  return 0;
}
