#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0;
  char ch = getchar();
  bool positive = 1;
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-') positive = 0;
  for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline char RC() {
  char c = getchar();
  while (c == ' ' || c == '\n') c = getchar();
  return c;
}
inline long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
inline long long lcm(long long a, long long b, long long MOD) {
  return a / gcd(a, b) * b % MOD;
}
inline long long Sub(long long x, long long y, long long mod) {
  long long res = x - y;
  while (res < 0) res += mod;
  return res;
}
inline long long Add(long long x, long long y, long long mod) {
  long long res = x + y;
  while (res >= mod) res -= mod;
  return res;
}
inline long long POW_MOD(long long x, long long y, long long mod) {
  long long ret = 1;
  while (y > 0) {
    if (y & 1) ret = ret * x % mod;
    x = x * x % mod;
    y >>= 1;
  }
  return ret;
}
const int N = 6005;
const int inf = 2100000000;
const long long INF = 1LL << 62;
const double PI = 3.14159265358;
int n, m;
int dis[N][N];
vector<pair<int, int> > fr[N], to[N];
vector<int> e[N];
bool vis[N];
void spfa(int u) {
  memset(vis, false, sizeof(vis));
  queue<int> q;
  q.push(u);
  vis[u] = true;
  dis[u][u] = 0;
  while (q.size()) {
    int cur = q.front();
    q.pop();
    vis[cur] = false;
    for (int i = 0; i < e[cur].size(); ++i) {
      int v = e[cur][i];
      if (dis[u][v] > dis[u][cur] + 1) {
        dis[u][v] = dis[u][cur] + 1;
        if (!vis[v]) {
          q.push(v);
        }
      }
    }
  }
}
void init() {
  for (int i = 0; i <= n; ++i) {
    for (int j = 0; j <= n; ++j) {
      dis[i][j] = inf;
    }
  }
}
bool judge(int a, int b, int c, int d) {
  if (a == b || a == c || a == d || b == c || b == d || c == d) return false;
  return true;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    e[u].push_back(v);
  }
  init();
  for (int i = 1; i <= n; ++i) {
    spfa(i);
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if (dis[i][j] == inf) continue;
      fr[i].push_back(make_pair(dis[i][j], j));
      to[j].push_back(make_pair(dis[i][j], i));
    }
    sort(fr[i].begin(), fr[i].end());
  }
  for (int i = 1; i <= n; ++i) sort(to[i].begin(), to[i].end());
  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 || dis[i][j] == inf) continue;
      for (int p = to[i].size() - 1; p >= max(0, (int)to[i].size() - 1 - 3);
           --p) {
        for (int q = fr[j].size() - 1; q >= max(0, (int)fr[j].size() - 4);
             --q) {
          int ii = to[i][p].second, jj = fr[j][q].second;
          if (judge(ii, i, j, jj)) {
            long long temp = dis[ii][i] + dis[i][j] + dis[j][jj];
            if (temp > ans) {
              ans = temp;
              a = ii, b = i, c = j, d = jj;
            }
          }
        }
      }
    }
  }
  cout << a << " " << b << " " << c << " " << d << endl;
  return 0;
}
