#include <bits/stdc++.h>
#pragma GCC optimize(1)
#pragma G++ optimize(1)
#pragma GCC optimize(2)
#pragma G++ optimize(2)
#pragma GCC optimize(3)
#pragma G++ optimize(3)
#pragma GCC optimize(4)
#pragma G++ optimize(4)
#pragma GCC optimize(5)
#pragma G++ optimize(5)
#pragma GCC optimize(6)
#pragma G++ optimize(6)
#pragma GCC optimize(7)
#pragma G++ optimize(7)
#pragma GCC optimize(8)
#pragma G++ optimize(8)
#pragma GCC optimize(9)
#pragma G++ optimize(9)
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
using namespace std;
const int INF = 2147483647;
inline void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
inline void rd(long long &val) {
  long long x = 0;
  int f = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  val = x * f;
}
inline void rd(int &val) {
  int x = 0;
  int f = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  val = x * f;
}
inline void print(int x) {
  write(x);
  putchar('\n');
}
int dist[5555][5555], n, m;
int ans[4];
vector<int> v[5555];
vector<pair<int, int> > nxt[5555], pre[5555];
int inf, a1, a2, a3, a4, sum;
inline void bfs(int x) {
  queue<int> q;
  int p;
  q.push(x);
  while (!q.empty()) {
    p = q.front();
    q.pop();
    for (int i = 0; i < v[p].size(); i++)
      if (dist[x][v[p][i]] == INF)
        dist[x][v[p][i]] = dist[x][p] + 1, q.push(v[p][i]);
  }
}
inline void work(int x) {
  for (int i = 1; i <= n; i++) dist[x][i] = INF;
  dist[x][x] = 0;
  bfs(x);
}
int main() {
  ios_base::sync_with_stdio(false);
  int i, j, k, f1, f2, x, y, l;
  rd(n), rd(m);
  memset(dist, 63, sizeof(dist));
  inf = dist[0][0];
  for (i = 0; i < m; i++) {
    rd(x), rd(y);
    v[x].push_back(y);
  }
  for (i = 1; i <= n; i++) work(i);
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
      if (i == j) continue;
      if (dist[i][j] != INF) nxt[i].push_back(make_pair(dist[i][j], j));
      if (dist[j][i] != INF) pre[i].push_back(make_pair(dist[j][i], j));
      if (nxt[i].size() > 3) {
        sort(nxt[i].begin(), nxt[i].end());
        nxt[i].erase(nxt[i].begin());
      }
      if (pre[i].size() > 3) {
        sort(pre[i].begin(), pre[i].end());
        pre[i].erase(pre[i].begin());
      }
    }
  }
  for (j = 1; j <= n; j++) {
    for (k = 1; k <= n; k++) {
      if (j == k) continue;
      for (pair<int, int> it1 : pre[j]) {
        i = it1.second;
        if (i == j || i == k) continue;
        for (pair<int, int> it2 : nxt[k]) {
          l = it2.second;
          if (i == l || j == l || k == l) continue;
          if (sum < dist[i][j] + dist[j][k] + dist[k][l]) {
            sum = dist[i][j] + dist[j][k] + dist[k][l];
            a1 = i, a2 = j, a3 = k, a4 = l;
          }
        }
      }
    }
  }
  cout << a1 << " " << a2 << " " << a3 << " " << a4 << endl;
  return 0;
}
