#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const int M = 500005;
int n, m, ed, top, qn, arc, fir[N], fae[N], stk[N], qx[N], qe[N], vis[N],
    sum[N], pos[N], use[M];
struct Edge {
  int v, nxt;
} e[M];
void adde(int x, int y) {
  e[++ed].v = y;
  e[ed].nxt = fir[x];
  fir[x] = ed;
}
int dfs1(int x) {
  vis[x] = 1;
  stk[++top] = x;
  for (int i = fir[x]; i; i = e[i].nxt) {
    if (vis[e[i].v] == 1) {
      for (; stk[top] != e[i].v;) qe[++qn] = fae[stk[top--]];
      qe[++qn] = i;
      return 1;
    }
    if (vis[e[i].v] == 0) {
      fae[e[i].v] = i;
      if (dfs1(e[i].v)) return 1;
    }
  }
  vis[x] = 2;
  --top;
  return 0;
}
void add(int l, int r) {
  sum[l]++;
  sum[r + 1]--;
  if (l > r) sum[1]++;
}
void dfs2(int x, int y) {
  vis[x] = 1;
  for (int i = fir[x]; i; i = e[i].nxt)
    if (!use[i]) {
      if (pos[e[i].v]) {
        add(pos[e[i].v], y);
        ++arc;
      } else if (!vis[e[i].v])
        dfs2(e[i].v, y);
    }
}
int dfs3(int x, int y) {
  vis[x] = 1;
  for (int i = fir[x]; i; i = e[i].nxt)
    if (e[i].v != y) {
      if (vis[e[i].v] == 1) return 1;
      if (vis[e[i].v] == 0 && dfs3(e[i].v, y)) return 1;
    }
  vis[x] = 2;
  return 0;
}
int main() {
  int i, j;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    adde(x, y);
  }
  for (i = 1; i <= n && !qn; ++i)
    if (!vis[i]) dfs1(i);
  assert(qn);
  reverse(qe + 1, qe + 1 + qn);
  for (i = 1; i <= qn; ++i) qx[i] = e[qe[i]].v;
  for (i = 1; i <= qn; ++i) pos[qx[i]] = i, use[qe[i]] = i;
  for (i = 1; i <= n; ++i) vis[i] = 0;
  for (i = 1; i <= qn; ++i) dfs2(qx[i], i);
  for (i = 1; i <= n; ++i) vis[i] = 0;
  for (i = qn; i; --i) dfs2(qx[i], i);
  for (i = 1; i <= qn; ++i) {
    sum[i] += sum[i - 1];
    if (sum[i] == arc) break;
  }
  if (i > qn) return puts("-1"), 0;
  int pos = qx[i];
  for (i = 1; i <= n; ++i) vis[i] = 0;
  for (i = 1; i <= n; ++i)
    if (i != pos && !vis[i] && dfs3(i, pos)) return puts("-1"), 0;
  printf("%d\n", pos);
  return 0;
}
