#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
vector<int> g[N];
pair<int, int> rev[N][N];
int n, m;
int sol[4], path;
pair<int, int> dist[N][N];
int duzina[N][N];
void bfs(int start) {
  queue<int> q;
  q.push(start);
  while (!q.empty()) {
    int xt = q.front();
    q.pop();
    for (auto u : g[xt]) {
      if (dist[start][u].first != 0 || u == start) continue;
      rev[u][start] = make_pair(dist[start][xt].first + 1, start);
      dist[start][u] = make_pair(dist[start][xt].first + 1, u);
      duzina[start][u] = duzina[start][xt] + 1;
      q.push(u);
    }
  }
}
bool cmp(pair<int, int> p, pair<int, int> q) { return p.first > q.first; }
pair<int, int> solve(int a, int b) {
  pair<int, int> p, q, r, t;
  if (rev[a][1].second == b) {
    p = rev[a][2];
    q = rev[a][3];
  } else {
    p = rev[a][1];
    if (rev[a][2].second == b)
      q = rev[a][3];
    else
      q = rev[a][2];
  }
  if (dist[b][1].second == a) {
    r = dist[b][2];
    t = dist[b][3];
  } else {
    r = dist[b][1];
    if (dist[b][2].second == a)
      t = dist[b][3];
    else
      t = dist[b][2];
  }
  if (p.second != r.second) return make_pair(p.second, r.second);
  if (p.first + t.first > q.first + r.first)
    return make_pair(p.second, t.second);
  return make_pair(q.second, r.first);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    g[a].push_back(b);
  }
  for (int i = 1; i <= n; i++) bfs(i);
  for (int i = 1; i <= n; i++) sort(rev[i] + 1, rev[i] + n + 1, cmp);
  for (int i = 1; i <= n; i++) sort(dist[i] + 1, dist[i] + n + 1, cmp);
  bool debug = false;
  if (debug) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        cout << rev[i][j].first << ", " << rev[i][j].second << " | ";
      }
      cout << endl;
    }
    cout << endl << endl;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        cout << dist[i][j].first << ", " << dist[i][j].second << " | ";
      }
      cout << endl;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j || duzina[i][j] == 0) continue;
      pair<int, int> x = solve(i, j);
      if (x.first == 0 || x.second == 0) continue;
      if (x.second == i || x.first == j) continue;
      if (duzina[x.first][i] + duzina[i][j] + duzina[j][x.second] > path) {
        path = duzina[x.first][i] + duzina[i][j] + duzina[j][x.second];
        sol[0] = x.first;
        sol[1] = i;
        sol[2] = j;
        sol[3] = x.second;
      }
    }
  }
  printf("%d %d %d %d", sol[0], sol[1], sol[2], sol[3]);
  return 0;
}
