#include <bits/stdc++.h>
using namespace std;
const int maxn = 305000;
int n, m, vis[3100];
int dp[3100][3100];
int Mxto[3100][2], posto[3100][2];
int Mxfrom[3100][2], posfrom[3100][2];
vector<int> G[3100];
int getret(int l, int p1, int r, int p2) {
  if (Mxto[l][p1] == -1) return -1;
  if (Mxfrom[r][p2] == -1) return -1;
  if (posto[l][p1] == posfrom[r][p2]) return -1;
  return Mxto[l][p1] + Mxfrom[r][p2];
}
void bfs(int s) {
  queue<pair<int, int> > q;
  q.push(make_pair(s, 0));
  memset(vis, 0, sizeof(vis));
  while (!q.empty()) {
    int now = q.front().first, dis = q.front().second;
    q.pop();
    if (vis[now]) continue;
    vis[now] = 1;
    dp[s][now] = dis;
    for (auto v : G[now]) {
      q.push(make_pair(v, dis + 1));
    }
  }
}
int main() {
  cin >> n >> m;
  memset(dp, -1, sizeof(dp));
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d", &u), scanf("%d", &v);
    dp[u][v] = 1;
    G[u].push_back(v);
  }
  for (int i = 1; i <= n; i++) bfs(i);
  for (int i = 1; i <= n; i++) {
    Mxfrom[i][0] = Mxfrom[i][1] = -1;
    for (int j = 1; j <= n; j++) {
      if (dp[i][j] > Mxfrom[i][0]) {
        Mxfrom[i][1] = Mxfrom[i][0], posfrom[i][1] = posfrom[i][0];
        Mxfrom[i][0] = dp[i][j], posfrom[i][0] = j;
      } else if (dp[i][j] > Mxfrom[i][1]) {
        Mxfrom[i][1] = dp[i][j], posfrom[i][1] = j;
      }
    }
    Mxto[i][0] = Mxto[i][1] = -1;
    for (int j = 1; j <= n; j++) {
      if (dp[j][i] > Mxto[i][0]) {
        Mxto[i][1] = Mxto[i][0], posto[i][1] = posto[i][0];
        Mxto[i][0] = dp[j][i], posto[i][0] = j;
      } else if (dp[j][i] > Mxto[i][1]) {
        Mxto[i][1] = dp[j][i], posto[i][1] = j;
      }
    }
  }
  int ans = 0;
  int id1, id2, id3, id4;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      if (dp[i][j] == -1) continue;
      for (int x = 0; x < 2; x++) {
        for (int y = 0; y < 2; y++) {
          int t = getret(i, x, j, y);
          if (t == -1) continue;
          if (posto[i][x] == i || posto[i][x] == j) continue;
          if (posfrom[j][y] == i || posfrom[j][y] == j) continue;
          if (t + dp[i][j] > ans) {
            ans = t + dp[i][j];
            id1 = posto[i][x], id4 = posfrom[j][y];
            id2 = i, id3 = j;
          }
        }
      }
    }
  }
  cout << id1 << " " << id2 << " " << id3 << " " << id4 << endl;
}
