#include <bits/stdc++.h>
using namespace std;
const int N = 3e3, M = 5e3, INF = 1e6;
int n, m;
vector<int> e[N + 1];
int dist[N + 1][N + 1];
bitset<N + 1> visited;
vector<int> ans(4);
set<pair<int, int>> farthest[N + 1];
set<pair<int, pair<int, int>>> temp[N + 1];
int total;
void init() {
  total = 0;
  ans[0] = 0;
  for (int i = 0, _stop = N; i <= _stop; i++) {
    e[i].clear();
    farthest[i].clear();
    temp[i].clear();
  }
  fill_n(&dist[0][0], (N + 1) * (N + 1), -INF);
}
void bfs(int u) {
  queue<int> q;
  q.push(u);
  dist[u][u] = 0;
  visited[u] = 1;
  while (q.empty() == false) {
    int cur = q.front();
    q.pop();
    for (int i = 0, _stop = e[cur].size() - 1; i <= _stop; i++) {
      int v = e[cur][i];
      if (visited[v] == 0) {
        visited[v] = 1;
        dist[u][v] = dist[u][cur] + 1;
        q.push(v);
      }
    }
  }
}
void consider(int u) {
  vector<int> local_ans(4);
  for (int v = 1, _stop = n; v <= _stop; v++) {
    if (u == v) {
      continue;
    }
    local_ans[0] = u;
    local_ans[1] = v;
    for (auto it = temp[v].rbegin(); it != temp[v].rend(); it++) {
      if (dist[u][v] + it->first > total) {
        int w = it->second.first;
        int x = it->second.second;
        if (w == u || w == v || x == w || x == u || x == v) {
          continue;
        }
        local_ans[2] = w;
        local_ans[3] = x;
        ans = local_ans;
        total = dist[u][v] + it->first;
      }
    }
  }
}
void solve() {
  for (int i = 1, _stop = n; i <= _stop; i++) {
    visited.reset();
    bfs(i);
    for (int j = 1, _stop = n; j <= _stop; j++) {
      farthest[i].insert({dist[i][j], j});
      if (farthest[i].size() > 5) {
        auto it = farthest[i].begin();
        auto it1 = it;
        it1++;
        farthest[i].erase(it, it1);
      }
    }
  }
  for (int i = 1, _stop = n; i <= _stop; i++) {
    for (int j = 1, _stop = n; j <= _stop; j++) {
      for (__typeof(farthest[j].begin()) it = farthest[j].begin();
           it != farthest[j].end(); it++) {
        temp[i].insert({dist[i][j] + it->first, {j, it->second}});
        if (temp[i].size() > 5) {
          temp[i].erase(temp[i].begin());
        }
      }
    }
  };
  for (int i = 1, _stop = n; i <= _stop; i++) {
    consider(i);
  };
  for (int i = 0, _stop = 3; i <= _stop; i++) {
    cout << ans[i] << " ";
  }
  cout << '\n';
}
int main() {
  ;
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  {
    init();
    cin >> n >> m;
    for (int i = 0, _stop = m - 1; i <= _stop; i++) {
      int u, v;
      cin >> u >> v;
      e[u].push_back(v);
    }
    solve();
  };
  return 0;
}
