#include <bits/stdc++.h>
using namespace std;
vector<int> v1[3010], v2[3010];
int dista[3010][3010], distb[3010][3010];
pair<int, int> besta[3010][3], bestb[3010][3];
int n, m;
void dijkstra(int x) {
  for (int i = 1; i <= n; i++) dista[x][i] = 1000000009;
  dista[x][x] = 0;
  priority_queue<pair<int, int> > q;
  q.push(make_pair(0, x));
  while (!q.empty()) {
    pair<int, int> t = q.top();
    q.pop();
    int u = t.second;
    for (int i = 0; i < v1[u].size(); i++) {
      if (dista[x][v1[u][i]] > dista[x][u] + 1) {
        dista[x][v1[u][i]] = dista[x][u] + 1;
        q.push(make_pair(-dista[x][v1[u][i]], v1[u][i]));
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (dista[x][i] != 1000000009 && dista[x][i] > besta[x][0].first)
      besta[x][2] = besta[x][1], besta[x][1] = besta[x][0],
      besta[x][0] = make_pair(dista[x][i], i);
    else if (dista[x][i] != 1000000009 && dista[x][i] > besta[x][1].first)
      besta[x][2] = besta[x][1], besta[x][1] = make_pair(dista[x][i], i);
    else if (dista[x][i] != 1000000009 && dista[x][i] > besta[x][2].first)
      besta[x][2] = make_pair(dista[x][i], i);
  }
}
void dijkstra2(int x) {
  for (int i = 1; i <= n; i++) distb[x][i] = 1000000009;
  distb[x][x] = 0;
  priority_queue<pair<int, int> > q;
  q.push(make_pair(0, x));
  while (!q.empty()) {
    pair<int, int> t = q.top();
    q.pop();
    int u = t.second;
    for (int i = 0; i < v2[u].size(); i++) {
      if (distb[x][v2[u][i]] > distb[x][u] + 1) {
        distb[x][v2[u][i]] = distb[x][u] + 1;
        q.push(make_pair(-distb[x][v2[u][i]], v2[u][i]));
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (distb[x][i] != 1000000009 && distb[x][i] > bestb[x][0].first)
      bestb[x][2] = bestb[x][1], bestb[x][1] = bestb[x][0],
      bestb[x][0] = make_pair(distb[x][i], i);
    else if (distb[x][i] != 1000000009 && distb[x][i] > bestb[x][1].first)
      bestb[x][2] = bestb[x][1], bestb[x][1] = make_pair(distb[x][i], i);
    else if (distb[x][i] != 1000000009 && distb[x][i] > bestb[x][2].first)
      bestb[x][2] = make_pair(distb[x][i], i);
  }
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    v1[x].push_back(y);
    v2[y].push_back(x);
  }
  int ans = -1, ansa, ansb, ansc, ansd;
  for (int i = 1; i <= n; i++) dijkstra(i);
  for (int i = 1; i <= n; i++) dijkstra2(i);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      for (int a = 0; a < 3; a++) {
        for (int d = 0; d < 3; d++) {
          int aa = bestb[i][a].second, dd = besta[j][d].second;
          if (aa == 0 || dd == 0) continue;
          if (i == j || i == aa || i == dd || j == aa || j == dd || aa == dd)
            continue;
          if (bestb[i][a].first == 1000000009 ||
              besta[j][d].first == 1000000009 || dista[i][j] == 1000000009)
            continue;
          int val = bestb[i][a].first + besta[j][d].first + dista[i][j];
          if (val > ans) {
            ans = val;
            ansa = aa;
            ansb = i;
            ansc = j;
            ansd = dd;
          }
        }
      }
    }
  }
  cout << ansa << " " << ansb << " " << ansc << " " << ansd << endl;
  return 0;
}
