#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N = 2e5 + 10;
const int M = 2e5 + 10;
const int SN = 1000;
const int K = 10;
const int LG = 21;
const ll mod = 1e9 + 7;
set<int> in[N], out[N];
array<char, N> used;
void del_leaf(int v) {
  for (auto f : in[v]) {
    out[f].erase(v);
    if (out[f].empty()) del_leaf(f);
  }
  in[v].clear();
}
int solve() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1, f, t; i <= m; ++i) {
    scanf("%d%d", &f, &t);
    out[f].insert(t);
    in[t].insert(f);
  }
  for (int i = 1; i <= n; ++i) {
    if (out[i].empty()) {
      del_leaf(i);
    }
  }
  used.fill(0);
  priority_queue<pair<int, int>, vector<pair<int, int>>, less<pair<int, int>>>
      que;
  for (int i = 1; i <= n; ++i) {
    if (out[i].size() == 1) {
      que.push({in[i].size(), i});
      used[i] = 1;
    }
  }
  while (que.size()) {
    int t, c;
    tie(t, c) = que.top();
    que.pop();
    int nxt = *out[c].begin();
    if (c == nxt) continue;
    in[nxt].erase(c);
    for (int f : in[c]) {
      out[f].erase(c);
      out[f].insert(nxt);
      in[nxt].insert(f);
      if (!used[f] && out[f].size() == 1) {
        que.push({in[f].size(), f});
        used[f] = 1;
      }
    }
    out[c].clear();
    in[c].clear();
  }
  int cnt = 0;
  int ans = 0;
  for (int i = 1; i <= n; ++i) {
    if (out[i].size()) {
      cnt++;
      ans = i;
    }
  }
  if (cnt == 1)
    printf("%d", ans);
  else
    printf("-1");
  return 0;
}
int main() {
  solve();
  return 0;
}
