#include <bits/stdc++.h>
using namespace std;
const int maxn = 3 * 1000 + 10;
vector<int> nei[maxn], nei2[maxn];
int mark[maxn];
queue<int> q;
int dis[maxn][maxn], dis2[maxn][maxn], mx[5][maxn], mx2[5][maxn];
const int inf = 1e8;
int n, m;
void bfs(int v, vector<int> g[maxn]) {
  for (int i = 1; i < maxn; i++) mark[i] = 0;
  mark[v] = 1;
  q.push(v);
  while (!q.empty()) {
    int fr = q.front();
    q.pop();
    for (int u = 0; u < g[fr].size(); u++) {
      if (!mark[g[fr][u]]) {
        q.push(g[fr][u]);
        mark[g[fr][u]] = mark[fr] + 1;
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    nei[x].push_back(y);
    nei2[y].push_back(x);
  }
  for (int i = 1; i <= n; i++) {
    bfs(i, nei);
    for (int j = 1; j <= n; j++) {
      if (mark[j] != 0) dis[i][j] = mark[j] - 1;
    }
    bfs(i, nei2);
    for (int j = 1; j <= n; j++) {
      if (mark[j] != 0) dis2[i][j] = mark[j] - 1;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (dis[i][j] == 0) continue;
      if (dis[i][j] > dis[i][mx[1][i]]) {
        mx[3][i] = mx[2][i];
        mx[2][i] = mx[1][i];
        mx[1][i] = j;
      } else if (dis[i][j] > dis[i][mx[2][i]]) {
        mx[3][i] = mx[2][i];
        mx[2][i] = j;
      } else if (dis[i][j] > dis[i][mx[3][i]])
        mx[3][i] = j;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (dis2[i][j] == 0) continue;
      if (dis2[i][j] > dis2[i][mx2[1][i]]) {
        mx2[3][i] = mx2[2][i];
        mx2[2][i] = mx2[1][i];
        mx2[1][i] = j;
      } else if (dis2[i][j] > dis2[i][mx2[2][i]]) {
        mx2[3][i] = mx2[2][i], mx2[2][i] = j;
      } else if (dis2[i][j] > dis[i][mx2[3][i]])
        mx2[3][i] = j;
    }
  }
  int a1 = 0, a2 = 0, a3 = 0, a4 = 0, sum = 0, maxx = 0;
  for (int b = 1; b <= n; b++) {
    for (int c = 1; c <= n; c++) {
      if (b == c) continue;
      sum = 0;
      for (int k = 1; k <= 3; k++) {
        for (int l = 1; l <= 3; l++) {
          if (mx2[k][b] == 0 || mx[l][c] == 0 || dis[b][c] == 0 ||
              mx2[k][b] == c || mx[l][c] == b || mx[l][c] == mx2[k][b])
            continue;
          sum = dis2[b][mx2[k][b]] + dis[b][c] + dis[c][mx[l][c]];
          if (sum > maxx) {
            a1 = mx2[k][b];
            a2 = b;
            a3 = c;
            a4 = mx[l][c];
            maxx = sum;
          }
        }
      }
    }
  }
  cout << a1 << " " << a2 << " " << a3 << " " << a4 << endl;
}
