#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void MAX(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
inline void MIN(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
inline void rd(T &x) {
  x = 0;
  char o, f = 1;
  while (o = getchar(), o < 48)
    if (o == '-') f = -f;
  do x = (x << 3) + (x << 1) + (o ^ 48);
  while (o = getchar(), o > 47);
  x *= f;
}
const int N = 3005;
const int M = 5005;
const int INF = 1e9;
int head1[N], head2[N], nxt[M << 1], to[M << 1], tot;
void add_edge(int head[], int a, int b) {
  nxt[++tot] = head[a];
  to[tot] = b;
  head[a] = tot;
}
int n, m, mx = -1, Q[N], ans[5];
int dis1[N][N], dis2[N][N], id1[N][5], id2[N][5];
void init(int dis[N][N], int head[N], int id[N][5]) {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) dis[i][j] = INF;
    int l = 1, r = 0;
    Q[++r] = i;
    dis[i][i] = 0;
    while (l <= r) {
      int x = Q[l++];
      for (int j = head[x]; j; j = nxt[j]) {
        int y = to[j];
        if (dis[i][y] == INF) {
          dis[i][y] = dis[i][x] + 1;
          Q[++r] = y;
        }
      }
    }
    if (r > 1) id[i][1] = Q[r];
    if (r > 2) id[i][2] = Q[r - 1];
    if (r > 3) id[i][3] = Q[r - 2];
  }
}
void chk(int a, int b, int c, int d) {
  if (dis1[a][b] == INF || dis1[b][c] == INF || dis1[c][d] == INF) return;
  int t = dis1[a][b] + dis1[b][c] + dis1[c][d];
  if (t > mx) {
    mx = t;
    ans[1] = a;
    ans[2] = b;
    ans[3] = c;
    ans[4] = d;
  }
}
int main() {
  rd(n), rd(m);
  while (m--) {
    int a, b;
    rd(a), rd(b);
    add_edge(head1, a, b);
    add_edge(head2, b, a);
  }
  init(dis1, head1, id1);
  init(dis2, head2, id2);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (i != j && dis1[i][j] != INF) {
        int a = 1, b = 1;
        if (id2[i][a] == j) a++;
        if (id1[j][b] == i) b++;
        if (id2[i][a] && id1[j][b] && id2[i][a] != id1[j][b]) {
          chk(id2[i][a], i, j, id1[j][b]);
        } else if (id2[i][a] && id1[j][b]) {
          int a_ = a + 1, b_ = b + 1;
          if (id2[i][a_] == j) a_++;
          if (id1[j][b_] == i) b_++;
          if (id1[j][b_]) chk(id2[i][a], i, j, id1[j][b_]);
          if (id2[i][a_]) chk(id2[i][a_], i, j, id1[j][b]);
        }
      }
  printf("%d %d %d %d\n", ans[1], ans[2], ans[3], ans[4]);
  return 0;
}
