#include <bits/stdc++.h>
using namespace std;
int dis[3005][3005];
bool pre[3005][3005];
vector<int> V[3005];
struct data {
  int first;
  int second;
  int third;
};
data fron[3005];
data rev[3005];
void BFS(int n) {
  for (int s = 1; s <= n; ++s) {
    queue<int> Q;
    Q.push(s);
    dis[s][s] = 0;
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      for (int i = 0; i < V[u].size(); ++i) {
        if (dis[s][V[u][i]] == -1) {
          dis[s][V[u][i]] = dis[s][u] + 1;
          Q.push(V[u][i]);
        }
      }
    }
  }
}
int main() {
  for (int i = 0; i < 3005; ++i)
    for (int j = 0; j < 3005; ++j) dis[i][j] = -1;
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    if (pre[a][b]) continue;
    pre[a][b] = 1;
    V[a].push_back(b);
  }
  BFS(n);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if (j == i) continue;
      if (dis[i][j] != -1) {
        if (fron[i].first == 0) {
          fron[i].first = j;
        } else if (dis[i][fron[i].first] < dis[i][j]) {
          fron[i].third = fron[i].second;
          fron[i].second = fron[i].first;
          fron[i].first = j;
        } else if (fron[i].second == 0) {
          fron[i].second = j;
        } else if (dis[i][fron[i].second] < dis[i][j]) {
          fron[i].third = fron[i].second;
          fron[i].second = j;
        } else if (fron[i].third == 0) {
          fron[i].third = j;
        } else if (dis[i][fron[i].third] < dis[i][j]) {
          fron[i].third = j;
        }
      }
      if (dis[j][i] != -1) {
        if (rev[i].first == 0) {
          rev[i].first = j;
        } else if (dis[rev[i].first][i] < dis[j][i]) {
          rev[i].third = rev[i].second;
          rev[i].second = rev[i].first;
          rev[i].first = j;
        } else if (rev[i].second == 0) {
          rev[i].second = j;
        } else if (dis[rev[i].second][i] < dis[j][i]) {
          rev[i].third = rev[i].second;
          rev[i].second = j;
        } else if (rev[i].third == 0) {
          rev[i].third = j;
        } else if (dis[rev[i].third][i] < dis[j][i])
          rev[i].third = j;
      }
    }
  }
  int ans = 0;
  int a, b, c, d;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if (i == j) continue;
      int temp = dis[i][j];
      if (temp == -1) continue;
      if (rev[i].first != j && rev[i].first != 0) {
        int u = rev[i].first;
        if (u != fron[j].first && fron[j].first != 0 && fron[j].first != i) {
          temp += (dis[u][i] + dis[j][fron[j].first]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].first;
          }
        } else if (u != fron[j].second && fron[j].second != 0 &&
                   fron[j].second != i) {
          temp += (dis[u][i] + dis[j][fron[j].second]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].second;
          }
        } else if (u != fron[j].third && fron[j].third != 0 &&
                   fron[j].third != i) {
          temp += (dis[u][i] + dis[j][fron[j].third]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].third;
          }
        }
      }
      temp = dis[i][j];
      if (rev[i].second != j && rev[i].second != 0) {
        int u = rev[i].second;
        if (u != fron[j].first && fron[j].first != 0 && fron[j].first != i) {
          temp += (dis[u][i] + dis[j][fron[j].first]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].first;
          }
        } else if (u != fron[j].second && fron[j].second != 0 &&
                   fron[j].second != i) {
          temp += (dis[u][i] + dis[j][fron[j].second]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].second;
          }
        } else if (u != fron[j].third && fron[j].third != 0 &&
                   fron[j].third != i) {
          temp += (dis[u][i] + dis[j][fron[j].third]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].third;
          }
        }
      }
      temp = dis[i][j];
      if (rev[i].third != j && rev[i].third != 0) {
        int u = rev[i].third;
        if (u != fron[j].first && fron[j].first != 0 && fron[j].first != i) {
          temp += (dis[u][i] + dis[j][fron[j].first]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].first;
          }
        } else if (u != fron[j].second && fron[j].second != 0 &&
                   fron[j].second != i) {
          temp += (dis[u][i] + dis[j][fron[j].second]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].second;
          }
        } else if (u != fron[j].third && fron[j].third != 0 &&
                   fron[j].third != i) {
          temp += (dis[u][i] + dis[j][fron[j].third]);
          if (temp > ans) {
            ans = temp;
            a = u, b = i, c = j, d = fron[j].third;
          }
        }
      }
    }
  }
  cout << a << " " << b << " " << c << " " << d << endl;
  return 0;
}
