#include <bits/stdc++.h>
using namespace std;
const int mx = 1e5 + 10;
int n, m, in[mx], ty, type[mx], d, mark;
vector<int> vec[mx];
int dfn[mx], id[mx], size, is, sta[mx];
int vis[mx], flag;
bool vic[mx];
void tarjan(int x) {
  dfn[x] = id[x] = is++;
  vis[x] = 1;
  sta[++size] = x;
  for (int i = 0; i < vec[x].size(); i++) {
    int son = vec[x][i];
    if (!dfn[son]) {
      tarjan(son);
      id[x] = min(id[x], id[son]);
    } else if (vis[son])
      id[x] = min(id[x], dfn[son]);
  }
  if (dfn[x] == id[x]) {
    ty++;
    if (sta[size] != x) d++, mark = ty;
    while (sta[size] != x) {
      type[sta[size]] = ty;
      vis[sta[size]] = 0;
      size--;
    }
    type[x] = ty, size--, vis[x] = 0;
  }
}
void dfs(int x, int num) {
  if (flag) return;
  for (int i = 0; i < vec[x].size(); i++) {
    if (flag) return;
    int son = vec[x][i];
    if (vis[son] == num) {
      if (vic[son])
        flag = -1;
      else
        flag = son, vic[son] = 1;
    }
    if (vis[son] < num) vis[son] = num, dfs(son, num);
  }
  vis[x] = num + 1;
}
double TIME() { return 1.0 * clock() / CLOCKS_PER_SEC; }
int check(int x, int num) {
  while (TIME() < 0.5) {
    vis[x] = num + 1;
    dfs(x, num);
    if (!flag) return x;
    if (flag == -1) return -1;
    x = flag, num += 2, flag = 0;
  }
  return -1;
}
int main() {
  scanf("%d%d", &n, &m);
  int a, b, c = 0, ans;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &a, &b);
    vec[a].push_back(b);
  }
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) tarjan(i);
  if (d > 1)
    puts("-1");
  else {
    for (int i = 1; i <= n; i++)
      if (type[i] == mark) {
        printf("%d\n", check(i, 1));
        break;
      }
  }
  return 0;
}
