#include <bits/stdc++.h>
using namespace std;
const long long inf = (1LL << 50);
int D[3010][3010];
bool v[3010][3010];
vector<int> g[3010];
vector<int> t[3010];
int mx[3010][2];
int node[3010][2];
int dx[3010][2];
int dode[3010][2];
void BFS(int root) {
  queue<int> Q;
  Q.push(root);
  int D[3010];
  bool v[3010];
  memset(D, 0, sizeof D);
  memset(v, false, sizeof v);
  D[root] = 0;
  v[root] = true;
  mx[root][0] = 0;
  node[root][0] = root;
  while (not Q.empty()) {
    int p = Q.front();
    Q.pop();
    for (__typeof(g[p].size()) i = 0; i < g[p].size(); i++) {
      int q = g[p][i];
      if (v[q] == false) {
        v[q] = true;
        D[q] = 1 + D[p];
        if (D[q] > mx[root][0]) {
          mx[root][1] = mx[root][0];
          node[root][1] = node[root][0];
          mx[root][0] = D[q];
          node[root][0] = q;
        } else if (D[q] > mx[root][1]) {
          mx[root][1] = D[q];
          node[root][1] = q;
        }
        Q.push(q);
      }
    }
  }
  return;
}
void AFS(int root) {
  queue<int> Q;
  Q.push(root);
  D[root][root] = 0;
  v[root][root] = true;
  dx[root][0] = 0;
  dode[root][0] = root;
  while (not Q.empty()) {
    int p = Q.front();
    Q.pop();
    for (__typeof(t[p].size()) i = 0; i < t[p].size(); i++) {
      int q = t[p][i];
      if (not v[root][q]) {
        v[root][q] = true;
        D[root][q] = 1 + D[root][p];
        Q.push(q);
        if (dx[root][0] < D[root][q]) {
          dx[root][1] = dx[root][0];
          dode[root][1] = dode[root][0];
          dx[root][0] = D[root][q];
          dode[root][0] = q;
        } else if (mx[root][1] < D[root][q]) {
          dx[root][1] = D[root][q];
          dode[root][1] = q;
        }
      }
    }
  }
  return;
}
bool F[3010];
int main(int argc, char const *argv[]) {
  int n, m;
  scanf("%d %d", &n, &m);
  for (__typeof(m) i = 1; i <= m; i++) {
    int p, q;
    scanf("%d %d", &p, &q);
    g[q].push_back(p);
    t[p].push_back(q);
  }
  for (__typeof(n) i = 1; i <= n; i++) BFS(i);
  memset(v, false, sizeof v);
  memset(D, 0, sizeof D);
  for (__typeof(n) i = 1; i <= n; i++) AFS(i);
  int ans = 0;
  int A, B, C, E;
  for (__typeof(n) i = 1; i <= n; i++) {
    for (__typeof(n) j = 1; j <= n; j++) {
      if (v[i][j] == false or i == j) continue;
      F[i] = F[j] = true;
      for (__typeof(2) p = 0; p < 2; p++) {
        for (__typeof(2) q = 0; q < 2; q++) {
          if (F[node[i][p]] or F[dode[j][q]]) continue;
          if (node[i][p] == dode[j][q]) continue;
          if (node[i][p] == 0) continue;
          if (dode[j][q] == 0) continue;
          if (D[i][j] + mx[i][p] + dx[j][q] > ans) {
            A = node[i][p];
            B = i;
            C = j;
            E = dode[j][q];
            ans = D[i][j] + mx[i][p] + dx[j][q];
          }
        }
      }
      F[i] = F[j] = false;
    }
  }
  printf("%d %d %d %d\n", A, B, C, E);
  return 0;
}
