#include <bits/stdc++.h>
using namespace std;
typedef struct four {
  int a, b, c, d;
  four(int e, int f, int g, int h) {
    a = e;
    b = f;
    c = g;
    d = h;
  }
} four;
int N, M, u, v;
vector<int> adj[3005];
vector<int> back_adj[3005];
vector<int> best[3005];
vector<int> back_best[3005];
int dist[3005][3005];
bool adj_m[3005][3005];
void compute_distances(int i) {
  queue<pair<int, int> > q1;
  q1.push(make_pair(i, 0));
  while (!q1.empty()) {
    pair<int, int> cur = q1.front();
    q1.pop();
    if (dist[i][cur.first] != -1) continue;
    dist[i][cur.first] = cur.second;
    best[i].push_back(cur.first);
    for (int j = 0; j < adj[cur.first].size(); j++) {
      int next = adj[cur.first][j];
      if (dist[i][next] == -1) q1.push(make_pair(next, cur.second + 1));
    }
  }
  int vis[3005];
  for (int j = 1; j <= N; j++) vis[j] = false;
  queue<pair<int, int> > q2;
  q2.push(make_pair(i, 0));
  while (!q2.empty()) {
    pair<int, int> cur = q2.front();
    q2.pop();
    if (vis[cur.first]) continue;
    vis[cur.first] = true;
    back_best[i].push_back(cur.first);
    for (int j = 0; j < back_adj[cur.first].size(); j++) {
      int next = back_adj[cur.first][j];
      if (!vis[next]) q2.push(make_pair(next, cur.second + 1));
    }
  }
  reverse(back_best[i].begin(), back_best[i].end());
  reverse(best[i].begin(), best[i].end());
}
int best_excl(int i, int u, int v) {
  for (int j = 0; j < best[i].size(); j++) {
    int cur = best[i][j];
    if (cur != u && cur != v && cur != i) {
      return cur;
    }
  }
  return -1;
}
int back_best_excl(int i, int u, int v) {
  for (int j = 0; j < back_best[i].size(); j++) {
    int cur = back_best[i][j];
    if (cur != u && cur != v && cur != i) {
      return cur;
    }
  }
  return -1;
}
pair<int, four> find_best_ordered_1(int i, int j) {
  int u = back_best_excl(i, j, -1);
  int v = best_excl(j, i, u);
  four f(u, i, j, v);
  if (u == -1 || v == -1 || dist[i][j] == -1)
    return make_pair(-1, f);
  else
    return make_pair(dist[i][j] + dist[u][i] + dist[j][v], f);
}
pair<int, four> find_best_ordered_2(int i, int j) {
  int v = best_excl(j, i, -1);
  int u = back_best_excl(i, j, v);
  four f(u, i, j, v);
  if (u == -1 || v == -1 || dist[i][j] == -1)
    return make_pair(-1, f);
  else
    return make_pair(dist[i][j] + dist[u][i] + dist[j][v], f);
}
pair<int, four> find_best_ordered(int i, int j) {
  pair<int, four> left = find_best_ordered_1(i, j);
  pair<int, four> right = find_best_ordered_2(i, j);
  if (left.first > right.first)
    return left;
  else
    return right;
}
int main() {
  cin >> N >> M;
  for (int m = 0; m < M; m++) {
    cin >> u >> v;
    adj[u].push_back(v);
    back_adj[v].push_back(u);
  }
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      dist[i][j] = -1;
    }
  }
  for (int n = 1; n <= N; n++) {
    compute_distances(n);
  }
  pair<int, four> best(0, four(-1, -1, -1, -1));
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (i == j) continue;
      pair<int, four> cur = find_best_ordered(i, j);
      if (cur.first > best.first) best = cur;
    }
  }
  cout << best.second.a << " " << best.second.b << " " << best.second.c << " "
       << best.second.d << endl;
  return 0;
}
