#include <bits/stdc++.h>
using namespace std;
vector<int> edge[5005];
int n, m;
int used[5005];
int cnct[5005][5005];
struct my_queue {
  int q[15] = {-1}, q2[15] = {-1};
  int l = 11, r = 10;
  inline pair<int, int> query(int num) {
    return make_pair(q[l + num - 1], q2[l + num - 1]);
  }
  inline void my_clear() {
    memset(q, -1, sizeof(q));
    memset(q2, -1, sizeof(q2));
    l = 11;
    r = 10;
  }
  inline void update(int x, int vt) {
    if (r - l + 1 == 3) {
      int cnt = 0;
      for (int i = l; i <= r; i++) {
        if (x > q[i]) break;
        cnt++;
      }
      if (cnt >= 3) return;
      for (int i = r + 1; i > l + cnt; i--) {
        q[i] = q[i - 1];
        q2[i] = q2[i - 1];
      }
      q[l + cnt] = x;
      q2[l + cnt] = vt;
      return;
    } else {
      if (r - l + 1 == 0) {
        l--;
        q[l] = x;
        q2[l] = vt;
        return;
      } else if (r - l + 1 == 1) {
        if (x >= q[l]) {
          l--;
          q[l] = x;
          q2[l] = vt;
        } else {
          l--;
          q[l] = q[r];
          q2[l] = q2[r];
          q[r] = x;
          q2[r] = vt;
        }
        return;
      } else {
        if (x >= q[l]) {
          l--;
          q[l] = x;
          q2[l] = vt;
        } else if (x >= q[r]) {
          l--;
          q[l] = q[r - 1];
          q2[l] = q2[r - 1];
          q[r - 1] = x;
          q2[r - 1] = vt;
        } else {
          l--;
          q[l] = q[r - 1];
          q2[l] = q2[r - 1];
          q[l + 1] = q[r];
          q2[l + 1] = q2[r];
          q[r] = x;
          q2[r] = vt;
        }
        return;
      }
    }
  }
};
my_queue dis[5005], anti_dis[5005];
inline void pre_process(int x) {
  memset(used, -1, sizeof(used));
  queue<int> que;
  que.push(x);
  used[x] = 0;
  while (!que.empty()) {
    int p = que.front();
    que.pop();
    for (int i = 0; i < edge[p].size(); i++) {
      int nx = edge[p][i];
      if (used[nx] == -1) {
        used[nx] = used[p] + 1;
        que.push(nx);
        dis[x].update(used[nx], nx);
        anti_dis[nx].update(used[nx], x);
        cnct[x][nx] = used[nx];
      }
    }
  }
  return;
}
int maxd = -1;
int ans[4];
set<int> se;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  memset(cnct, -1, sizeof(cnct));
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    if (u == v) continue;
    if (se.find(u * 10000 + v) != se.end()) continue;
    edge[u].push_back(v);
    se.insert(u * 10000 + v);
  }
  for (int i = 1; i <= n; i++) {
    pre_process(i);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1 + i; j <= n; j++) {
      if (cnct[i][j] != -1) {
        for (int ii = 1; ii <= 3; ii++) {
          for (int jj = 1; jj <= 3; jj++) {
            int d = cnct[i][j];
            pair<int, int> p1 = anti_dis[i].query(ii);
            pair<int, int> p2 = dis[j].query(jj);
            if (p1.second != p2.second && p1.second != j && p2.second != i &&
                cnct[p1.second][i] != -1 && cnct[j][p2.second] != -1) {
              d += (p1.first + p2.first);
              if (d > maxd) {
                maxd = d;
                ans[0] = p1.second;
                ans[1] = i;
                ans[2] = j;
                ans[3] = p2.second;
              }
            }
          }
        }
      }
      if (cnct[j][i] != -1) {
        for (int jj = 1; jj <= 3; jj++) {
          for (int ii = 1; ii <= 3; ii++) {
            int d = cnct[j][i];
            pair<int, int> p1 = anti_dis[j].query(jj);
            pair<int, int> p2 = dis[i].query(ii);
            if (p1.second != p2.second && p1.second != i && p2.second != j &&
                cnct[p1.second][j] != -1 && cnct[i][p2.second] != -1) {
              d += (p1.first + p2.first);
              if (d > maxd) {
                maxd = d;
                ans[0] = p1.second;
                ans[1] = j;
                ans[2] = i;
                ans[3] = p2.second;
              }
            }
          }
        }
      }
    }
  }
  cout << ans[0];
  for (int i = 1; i < 4; i++) {
    cout << " " << ans[i];
  }
  cout << endl;
  return 0;
}
