#include <iostream>
#include <algorithm>
#include <cstring>
#include <utility>
#include <vector>
#include <queue>
#define d first
#define id second
using namespace std;
constexpr int N = 3e3 + 5;
int n, m, vis[N];
vector<int> g[N];
int pre[N][N], dx[N][N];
pair<int, int> dis[N][N];
inline void dij(int s) {
memset(dis[s], -1, sizeof(dis[s]));
dis[s][s].d = 0;
memset(dx[s], -1, sizeof(dx[s]));
dx[s][s] = 0;
for (int i = 1; i <= n; ++i)
dis[s][i].id = i;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
q.push({0, s});
while (!q.empty()) {
int u = q.top().id;
q.pop();
vis[u] = 1;
for (int l = 0; l < g[u].size(); ++l) {
int i = g[u][l];
if (dis[s][i].d > dis[s][u].d + 1 || dis[s][i].d == -1) {
dis[s][i].d = dis[s][u].d + 1;
dx[s][i] = dx[s][u] + 1;
if (!vis[i]) q.push({dis[s][i].d, i});
}
}
}
sort(dis[s] + 1, dis[s] + n + 1, greater<pair<int, int>>());
}
int id;
inline bool cmp(int a, int b) {
return dx[a][id] > dx[b][id];
}
inline void special() {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j)
if (dx[j][i] != -1) pre[i][j] = j;
id = i;
sort(pre[i] + 1, pre[i] + n + 1, cmp);
}
}
signed main() {
cin >> n >> m;
while (m--) {
int u, v;
cin >> u >> v;
g[u].emplace_back(v);
}
for (int i = 1; i <= n; ++i) {
memset(vis, 0, sizeof(vis));
dij(i);
}
special();
int ans = 0, anss[5];
for (int j = 1; j <= n; ++j)
for (int k = 1; k <= n; ++k) {
if (j == k || dx[j][k] == -1) continue;
int cnti = 0;
for (int ix = 1; cnti <= 3&& ix <= n; ++ix) {
int i = pre[j][ix];
if (i == j || k == i) continue;
++cnti;
int cntl = 0;
for (int lx = 1; cntl <= 3 && lx <= n; ++lx) {
int l = dis[k][lx].id;
if (i == l || k == l || j == l) continue;
++cntl;
if (ans < dx[i][j] + dx[j][k] + dis[k][lx].d) {
ans = dx[i][j] + dx[j][k] + dis[k][lx].d;
anss[1] = i, anss[2] = j, anss[3] = k, anss[4] = l;
}
}
}
}
for (int i = 1; i <= 4; ++i)
cout << anss[i] << ' ';
return 0;
}