#include <bits/stdc++.h>
using namespace std;
vector<int> vi;
const int mod = int(1e9) + 7, INF = 0x3f3f3f3f;
const int maxv = 3e3 + 13;
const int maxe = 5e3 + 13;
int n, m;
vector<int> v[maxv];
int d[maxv];
struct node {
  int key, dist;
  node() {}
  node(int A, int B) : key(A), dist(B) {}
};
void bfs(int s) {
  memset(d, 0x3f, sizeof(d));
  d[s] = 0;
  queue<node> que;
  que.push(node(s, 0));
  while (!que.empty()) {
    node cur = que.front();
    que.pop();
    if (cur.dist > d[cur.key]) continue;
    for (int i = 0; i < (int)v[cur.key].size(); i++) {
      int to = v[cur.key][i];
      if (d[to] > d[cur.key] + 1) {
        d[to] = d[cur.key] + 1;
        que.push(node(to, d[to]));
      }
    }
  }
}
vector<node> G[maxv], fG[maxv];
int dis[maxv][maxv], fdis[maxv][maxv];
int dm[maxv], fdm[maxv];
int main(void) {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  scanf("%d", &(n)), scanf("%d", &(m));
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d", &(x)), scanf("%d", &(y));
    v[x].push_back(y);
  }
  for (int i = 1; i < n + 1; i++) {
    bfs(i);
    for (int j = 1; j < n + 1; j++) {
      if (d[j] != INF && d[j]) {
        G[i].push_back(node(j, d[j]));
        fG[j].push_back(node(i, d[j]));
        dm[i] = max(dm[i], d[j]);
        fdm[j] = max(fdm[j], d[j]);
        dis[i][j] = d[j];
        fdis[j][i] = d[j];
      }
    }
  }
  int ans = 0;
  int out[4];
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < n + 1; j++) {
      if (i == j) continue;
      if (dis[i][j] == 0) continue;
      if (dis[i][j] + dm[j] + fdm[i] <= ans) continue;
      int temp = dis[i][j];
      int maxj = 0, logj = -1, maxi = 0, logi = -1;
      for (int k = 0; k < (int)G[j].size(); k++) {
        if (G[j][k].key != i && G[j][k].key != j && G[j][k].dist > maxj) {
          maxj = G[j][k].dist;
          logj = G[j][k].key;
        }
      }
      for (int k = 0; k < (int)fG[i].size(); k++) {
        if (fG[i][k].key != i && fG[i][k].key != j && logj != -1 &&
            fG[i][k].key != logj && fG[i][k].dist > maxi) {
          maxi = fG[i][k].dist;
          logi = fG[i][k].key;
        }
      }
      if (logi != -1 && logj != -1) {
        temp += maxi + maxj;
        if (temp > ans) {
          out[0] = logi, out[1] = i, out[2] = j, out[3] = logj;
          ans = temp;
        }
      }
    }
  }
  for (int i = 0; i < 4; i++) printf("%d ", out[i]);
  return 0;
}
