#include <bits/stdc++.h>
using namespace std;
void precalc(){};
const int N = 3010;
int n, m;
vector<vector<int>> g;
vector<vector<int>> dist;
pair<int, int> pre[N][3], post[N][3];
void bfs(int x) {
  queue<int> q;
  q.push(x);
  while (q.size()) {
    int head = q.front();
    q.pop();
    for (auto c : g[head]) {
      if (dist[x][c] > n) {
        dist[x][c] = dist[x][head] + 1;
        q.push(c);
      }
    }
  }
}
inline bool distinct(int a, int b, int c, int d) {
  vector<int> z = {a, b, c, d};
  sort(z.begin(), z.end());
  return z[0] != z[1] && z[1] != z[2] && z[2] != z[3];
}
void solve(int ncase) {
  cin >> n >> m;
  g.assign(n + 1, vector<int>());
  dist.assign(n + 1, vector<int>(n + 1, n + 1));
  for (int i = 1; i <= n; i++) {
    dist[i][i] = 0;
  }
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    g[x].push_back(y);
  }
  for (int i = 1; i <= n; i++) {
    bfs(i);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (dist[j][i] <= n) {
        pair<int, int> tmppre = pair<int, int>(dist[j][i], j);
        if (tmppre > pre[i][2]) {
          pre[i][2] = tmppre;
          if (pre[i][2] > pre[i][1]) {
            swap(pre[i][2], pre[i][1]);
            if (pre[i][1] > pre[i][0]) {
              swap(pre[i][1], pre[i][0]);
            }
          }
        }
      }
      if (dist[i][j] <= n) {
        pair<int, int> tmppost = pair<int, int>(dist[i][j], j);
        if (tmppost > post[i][2]) {
          post[i][2] = tmppost;
          if (post[i][2] > post[i][1]) {
            swap(post[i][2], post[i][1]);
            if (post[i][1] > post[i][0]) {
              swap(post[i][1], post[i][0]);
            }
          }
        }
      }
    }
  }
  int ans = -1;
  vector<int> ret(4);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j || dist[i][j] > n) continue;
      for (int a = 0; a < 3; a++) {
        if (pre[i][a].second == 0) continue;
        for (int b = 0; b < 3; b++) {
          if (post[j][b].second == 0) continue;
          int tmp = pre[i][a].first + dist[i][j] + post[j][b].first;
          if (tmp > ans &&
              distinct(pre[i][a].second, i, j, post[j][b].second)) {
            ans = tmp;
            ret = {pre[i][a].second, i, j, post[j][b].second};
          }
        }
      }
    }
  }
  cout << ret[0] << " " << ret[1] << " " << ret[2] << " " << ret[3] << endl;
}
int main() {
  int T = 1;
  int ncase = 0;
  while (T--) {
    solve(++ncase);
  }
}
