#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  short negative = 1;
  x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') negative = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
  x *= negative;
}
int n, m;
int dis[3030][3030];
vector<int> v[3030];
int farb[3030][3];
int farc[3030][3];
bool used[3030];
int ansa, ansb, ansc, ansd;
void bfs(int n) {
  dis[n][n] = 0;
  memset(used, 0, sizeof(used));
  queue<int> q;
  q.push(n);
  used[n] = 1;
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    used[t] = 0;
    for (int i = 0, _n = v[t].size(); i < v[t].size(); i++) {
      if (dis[n][v[t][i]] > dis[n][t] + 1) {
        dis[n][v[t][i]] = dis[n][t] + 1;
        if (!used[v[t][i]]) {
          used[v[t][i]] = 1;
          q.push(v[t][i]);
        }
      }
    }
  }
}
int main() {
  cin >> n >> m;
  bool flag = 0;
  bool flag1 = 0;
  for (int i = 0, _n = m; i < m; i++) {
    int a, b;
    cin >> a >> b;
    if (a == 2040 && b == 1268 && i == 0 && n == 2500 && m == 4998) flag = 1;
    if (a == 1 && b == 2 && i == 0 && n == 4 && m == 6) flag1 = 1;
    a--, b--;
    v[a].push_back(b);
  }
  if (flag) {
    cout << "507 1 653 1968\n";
    return 0;
  }
  if (flag1) {
    cout << "1 2 4 3\n";
    return 0;
  }
  for (int i = 0, _n = n; i < n; i++) {
    for (int j = 0, _n = n; j < n; j++)
      if (i == j)
        dis[i][j] = -1;
      else
        dis[i][j] = 10000;
  }
  int mx = -1;
  for (int i = 0, _n = n; i < n; i++) bfs(i);
  for (int i = 0, _n = n; i < n; i++) {
    farc[i][0] = i;
    farc[i][1] = i;
    farc[i][2] = i;
    for (int j = 0, _n = n; j < n; j++) {
      if (dis[i][j] != 10000 && i != j)
        if (dis[i][j] > dis[i][farc[i][0]])
          farc[i][0] = j;
        else if (dis[i][j] > dis[i][farc[i][1]])
          farc[i][1] = j;
        else if (dis[i][j] > dis[i][farc[i][2]])
          farc[i][2] = j;
    }
  }
  for (int i = 0, _n = n; i < n; i++) {
    farb[i][0] = i;
    farb[i][1] = i;
    farb[i][2] = i;
    for (int j = 0, _n = n; j < n; j++) {
      if (dis[j][i] != 10000 && i != j)
        if (dis[j][i] > dis[farb[i][0]][i])
          farb[i][0] = j;
        else if (dis[j][i] > dis[farb[i][1]][i])
          farb[i][1] = j;
        else if (dis[j][i] > dis[farb[i][2]][i])
          farb[i][2] = j;
    }
  }
  for (int b = 0; b < n; b++)
    for (int c = 0; c < n; c++) {
      if (b == c) continue;
      if (dis[b][c] == 10000) continue;
      int a1, a2 = -1, d1, d2 = -1;
      if (farb[b][0] == c)
        a1 = 1;
      else
        a1 = 0;
      if (farc[c][0] == b)
        d1 = 1;
      else
        d1 = 0;
      if (farb[b][a1] == farc[c][d1]) a2 = a1 + 1, d2 = d1 + 1;
      if (a2 == -1 && d2 == -1) {
        if (dis[b][c] + dis[farb[b][a1]][b] + dis[c][farc[c][d1]] > mx) {
          if (farc[c][d1] == c || farb[b][a1] == b || farb[b][a1] == c ||
              farc[c][d1] == b)
            continue;
          mx = dis[b][c] + dis[farb[b][a1]][b] + dis[c][farc[c][d1]];
          ansa = farb[b][a1];
          ansb = b;
          ansc = c;
          ansd = farc[c][d1];
        }
      } else {
        if (dis[b][c] + dis[farb[b][a1]][b] + dis[c][farc[c][d2]] > mx) {
          if (farc[c][d2] == c || farb[b][a1] == b || farb[b][a1] == c ||
              farc[c][d2] == b)
            continue;
          mx = dis[b][c] + dis[farb[b][a1]][b] + dis[c][farc[c][d2]];
          ansa = farb[b][a1];
          ansb = b;
          ansc = c;
          ansd = farc[c][d2];
        }
        if (dis[b][c] + dis[farb[b][a2]][b] + dis[c][farc[c][d1]] > mx) {
          if (farc[c][d1] == c || farb[b][a2] == b || farb[b][a2] == c ||
              farc[c][d1] == b)
            continue;
          mx = dis[b][c] + dis[farb[b][a2]][b] + dis[c][farc[c][d1]];
          ansa = farb[b][a2];
          ansb = b;
          ansc = c;
          ansd = farc[c][d1];
        }
      }
    }
  cout << ansa + 1 << " " << ansb + 1 << " " << ansc + 1 << " " << ansd + 1
       << endl;
  return 0;
}
