#include <bits/stdc++.h>
using namespace std;
struct aa {
  int to, next;
} a[5010 * 2];
int head[3010], Dis[3010][3010];
pair<int, int> g[3010][3], f[3010][3];
int n, m, num, x, y, z, i, j, ans;
int c[100010], vis[3010], dis[3010], Ans[4];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch <= '9' && ch >= '0') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) write(x / 10);
  putchar(x % 10 + '0');
}
inline void add(int x, int y) {
  num++;
  a[num].next = head[x];
  a[num].to = y;
  head[x] = num;
}
inline void update(int x, int y, int z, int pos) {
  if (pos == 0) {
    if (z > f[x][0].second) {
      swap(f[x][2], f[x][1]);
      swap(f[x][1], f[x][0]);
      f[x][0] = make_pair(y, z);
    } else if (z > f[x][1].second) {
      swap(f[x][2], f[x][1]);
      f[x][1] = make_pair(y, z);
    } else if (z > f[x][2].second)
      f[x][2] = make_pair(y, z);
  } else {
    if (z > g[x][0].second) {
      swap(g[x][2], g[x][1]);
      swap(g[x][1], g[x][0]);
      g[x][0] = make_pair(y, z);
    } else if (z > g[x][1].second) {
      swap(g[x][2], g[x][1]);
      g[x][1] = make_pair(y, z);
    } else if (z > g[x][2].second)
      g[x][2] = make_pair(y, z);
  }
}
inline void get(int st) {
  int i, x, y, h, t;
  h = 0;
  t = 1;
  c[1] = st;
  memset(dis, 1, sizeof(dis));
  vis[st] = 1;
  dis[st] = 0;
  while (h < t) {
    h++;
    x = c[h];
    for (i = head[x]; i; i = a[i].next) {
      y = a[i].to;
      if (dis[y] > dis[x] + 1) {
        dis[y] = dis[x] + 1;
        if (vis[y]) continue;
        vis[y] = 1;
        t++;
        c[t] = y;
      }
    }
    vis[x] = 0;
  }
  for (i = 1; i <= n; i++) {
    if (dis[i] <= n) {
      update(st, i, dis[i], 0);
      update(i, st, dis[i], 1);
    }
    Dis[st][i] = dis[i];
  }
}
inline void work(int B, int C) {
  int i, j, A, D, now;
  for (i = 0; i < 3; i++) {
    A = g[B][i].first;
    if (A == C || A == 0) continue;
    for (j = 0; j < 3; j++) {
      D = f[C][j].first;
      if (D == B || D == A || D == 0) continue;
      now = Dis[B][C] + g[B][i].second + f[C][j].second;
      if (now > ans) ans = now, Ans[0] = A, Ans[1] = B, Ans[2] = C, Ans[3] = D;
    }
  }
}
int main() {
  n = read();
  m = read();
  for (i = 1; i <= m; i++) {
    x = read();
    y = read();
    add(x, y);
  }
  ans = 0;
  for (i = 1; i <= n; i++) get(i);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++)
      if (i != j && Dis[i][j] < n) work(i, j);
  for (i = 0; i < 4; i++) write(Ans[i]), putchar(' ');
}
