#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Pii = pair<int, int>;
using Vi = vector<int>;
void run();
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(18);
  run();
  return 0;
}
int uplg(int n) { return 32 - __builtin_clz(n); }
int uplg(ll n) { return 64 - __builtin_clzll(n); }
struct Vert {
  Vi out, dagOut;
  int seen{0}, degIn{0};
};
vector<Vert> G;
void dfs(int i) {
  if (G[i].seen) return;
  G[i].seen = 1;
  for (auto& e : (G[i].out)) {
    if (G[e].seen != 1) {
      G[i].dagOut.push_back(e);
      G[e].degIn++;
    }
    dfs(e);
  }
  G[i].seen = 2;
}
void run() {
  int n, m;
  cin >> n >> m;
  G.resize(n);
  for (int i = (0); i < (m); i++) {
    int a, b;
    cin >> a >> b;
    G[a - 1].out.push_back(b - 1);
  }
  for (int i = (0); i < (n); i++) dfs(i);
  queue<int> que;
  for (int i = (0); i < (n); i++)
    if (G[i].degIn == 0) que.push(i);
  while (!que.empty()) {
    int a = que.front();
    que.pop();
    if (que.empty()) {
      cout << "! " << a + 1 << endl;
      return;
    }
    int b = que.front();
    que.pop();
    cout << "? " << a + 1 << ' ' << b + 1 << endl;
    int dir;
    cin >> dir;
    if (dir) swap(a, b);
    que.push(b);
    for (auto& e : (G[a].dagOut))
      if (--G[e].degIn == 0) que.push(e);
  }
  assert(0);
}
