#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> adj1[3500], adj2[3500];
vector<pair<long long, long long> > modified1[3500], modified2[3500];
bool visited[3500];
bool present[3100][3100];
struct CitiesWithDistance {
  int firstCountry = 0;
  int secondCountry = 0;
  int thirdCountry = 0;
  int fourthCountry = 0;
  long long overAllDistance = 0;
};
void bfs1(int node) {
  queue<int> q;
  q.push(node);
  for (int dist = 0, sz = q.size(); !q.empty(); dist++, sz = q.size()) {
    while (sz--) {
      int u = q.front();
      q.pop();
      if (u != node)
        modified1[node].push_back(pair<long long, long long>(u, dist));
      for (int i = 0; i < adj1[u].size(); i++)
        if (!visited[adj1[u][i]]) {
          visited[adj1[u][i]] = 1;
          q.push(adj1[u][i]);
        }
    }
  }
}
void bfs2(int node) {
  queue<int> q;
  q.push(node);
  for (int dist = 0, sz = q.size(); !q.empty(); dist++, sz = q.size()) {
    while (sz--) {
      int u = q.front();
      q.pop();
      if (u != node)
        modified2[node].push_back(pair<long long, long long>(u, dist));
      for (int i = 0; i < adj2[u].size(); i++)
        if (!visited[adj2[u][i]]) {
          visited[adj2[u][i]] = 1;
          q.push(adj2[u][i]);
        }
    }
  }
}
CitiesWithDistance forMaxNodes(int city2) {
  visited[city2] = 1;
  int forwardSize = modified1[city2].size();
  int backwordSize = modified2[city2].size();
  CitiesWithDistance returnValue;
  for (int i = backwordSize - 1; i >= max(0, backwordSize - 3); i--) {
    int city1 = modified2[city2][i].first;
    int distance1 = modified2[city2][i].second;
    visited[city1] = 1;
    for (int j = forwardSize - 1; j >= 0; j--) {
      int city3 = modified1[city2][j].first;
      int distance2 = modified1[city2][j].second;
      if (visited[city3]) continue;
      visited[city3] = 1;
      int forwardSizeformCity3 = modified1[city3].size();
      for (int k = forwardSizeformCity3 - 1;
           k >= max(0, forwardSizeformCity3 - 3); k--) {
        int city4 = modified1[city3][k].first;
        int distance3 = modified1[city3][k].second;
        if (visited[city4]) continue;
        long long Totaldistance = distance1 + distance2 + distance3;
        if (Totaldistance > returnValue.overAllDistance) {
          returnValue.firstCountry = city1;
          returnValue.secondCountry = city2;
          returnValue.thirdCountry = city3;
          returnValue.fourthCountry = city4;
          returnValue.overAllDistance = Totaldistance;
        }
      }
      visited[city3] = 0;
    }
    visited[city1] = 0;
  }
  return returnValue;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    if (present[a][b] || a == b) continue;
    present[a][b] = 1;
    adj1[a].push_back(b);
    adj2[b].push_back(a);
  }
  for (int i = 1; i <= n; i++) {
    memset(visited, 0, sizeof visited);
    bfs1(i);
    memset(visited, 0, sizeof visited);
    bfs2(i);
  }
  CitiesWithDistance result;
  for (int i = 1; i <= n; i++) {
    memset(visited, 0, sizeof visited);
    CitiesWithDistance forThatVertex = forMaxNodes(i);
    if (forThatVertex.overAllDistance > result.overAllDistance)
      result = forThatVertex;
  }
  cout << result.firstCountry << " " << result.secondCountry << " "
       << result.thirdCountry << " ";
  cout << result.fourthCountry;
}
