#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const double g = 10.0, eps = 1e-9;
const int N = 3000 + 10, maxn = 5000 + 10, inf = 0x3f3f3f;
struct edge {
  int to, Next, w;
} e[maxn];
int head[N], cnt;
int n, m;
int d[N], ans[N][N];
void add(int u, int v) {
  e[cnt].to = v;
  e[cnt].w = 1;
  e[cnt].Next = head[u];
  head[u] = cnt++;
}
void spfa(int x) {
  bool vis[N];
  memset(vis, 0, sizeof vis);
  vis[x] = 1;
  memset(d, inf, sizeof d);
  d[x] = 0;
  queue<int> q;
  q.push(x);
  while (!q.empty()) {
    int s = q.front();
    q.pop();
    vis[s] = 0;
    for (int i = head[s]; ~i; i = e[i].Next) {
      int W = e[i].w, To = e[i].to;
      if (d[s] + W < d[To]) {
        d[To] = d[s] + W;
        if (!vis[To]) {
          vis[To] = 1;
          q.push(To);
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) ans[x][i] = min(ans[x][i], d[i]);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  cnt = 0;
  memset(head, -1, sizeof head);
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    add(x, y);
  }
  memset(ans, inf, sizeof ans);
  for (int i = 1; i <= n; i++) ans[i][i] = 0;
  for (int i = 1; i <= n; i++) spfa(i);
  int cur = 0, a, b, c, d;
  vector<pair<int, int> > v1[N], v2[N];
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      if (ans[i][j] < inf) v1[i].push_back(make_pair(ans[i][j], j));
      if (ans[j][i] < inf) v2[i].push_back(make_pair(ans[j][i], j));
    }
    sort(v1[i].begin(), v1[i].end());
    reverse(v1[i].begin(), v1[i].end());
    sort(v2[i].begin(), v2[i].end());
    reverse(v2[i].begin(), v2[i].end());
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j || ans[i][j] >= inf) continue;
      for (int k = 0; k < 4 && k < v2[i].size(); k++) {
        int ccc = v2[i][k].second;
        if (ccc == i || ccc == j) continue;
        for (int l = 0; l < 4 && l < v1[j].size(); l++) {
          int ddd = v1[j][l].second;
          if (ddd == i || ddd == j || ddd == ccc) continue;
          if (cur < ans[i][j] + v1[j][l].first + v2[i][k].first) {
            cur = ans[i][j] + v1[j][l].first + v2[i][k].first;
            a = ccc, b = i, c = j, d = ddd;
          }
        }
      }
    }
  }
  cout << a << " " << b << " " << c << " " << d << endl;
  return 0;
}
