#include <bits/stdc++.h>
using namespace std;
long long n, m;
vector<long long> adj[3005];
bool ad[3005][3005];
vector<long long> rev[3005];
bool vis[3005];
long long dst[3005][3005];
vector<pair<long long, long long> > st[3005];
vector<pair<long long, long long> > rv[3005];
vector<pair<long long, long long> > vec;
deque<pair<long long, long long> > dq;
bool comp(pair<long long, long long> a, pair<long long, long long> b) {
  if (a.second > b.second)
    return true;
  else
    return false;
}
void bfs(long long s) {
  pair<long long, long long> pp;
  long long ch;
  vis[s] = true;
  dq.push_back(make_pair(s, 0));
  while (!dq.empty()) {
    pp = dq.front();
    dq.pop_front();
    for (long long i = 0; i < adj[pp.first].size(); i++) {
      ch = adj[pp.first][i];
      if (vis[ch] == false) {
        vis[ch] = true;
        dst[s][ch] = pp.second + 1;
        vec.push_back(make_pair(ch, pp.second + 1));
        dq.push_back(make_pair(ch, pp.second + 1));
      }
    }
  }
  sort(vec.begin(), vec.end(), comp);
  for (long long i = 0; i < 3 && i < vec.size(); i++) {
    st[s].push_back(vec[i]);
  }
  return;
}
void rbfs(long long s) {
  pair<long long, long long> pp;
  long long ch;
  vis[s] = true;
  dq.push_back(make_pair(s, 0));
  while (!dq.empty()) {
    pp = dq.front();
    dq.pop_front();
    for (long long i = 0; i < rev[pp.first].size(); i++) {
      ch = rev[pp.first][i];
      if (vis[ch] == false) {
        vis[ch] = true;
        vec.push_back(make_pair(ch, pp.second + 1));
        dq.push_back(make_pair(ch, pp.second + 1));
      }
    }
  }
  sort(vec.begin(), vec.end(), comp);
  for (long long i = 0; i < 3 && i < vec.size(); i++) {
    rv[s].push_back(vec[i]);
  }
  return;
}
bool valid(long long a, long long b, long long c, long long d) {
  if (a != d && a != c && d != b) {
    return true;
  } else
    return false;
}
int main() {
  long long t1, t2;
  cin >> n >> m;
  for (long long i = 0; i < n; i++) memset(dst[i], -1, sizeof(dst[i]));
  for (long long i = 0; i < n; i++) memset(ad[i], false, sizeof(ad[i]));
  for (long long i = 0; i < m; i++) {
    cin >> t1 >> t2;
    t1--;
    t2--;
    if (ad[t1][t2] == true) continue;
    adj[t1].push_back(t2);
    rev[t2].push_back(t1);
    ad[t1][t2] = true;
  }
  for (long long i = 0; i < n; i++) {
    memset(vis, false, sizeof(vis));
    vec.clear();
    bfs(i);
  }
  for (long long i = 0; i < n; i++) {
    memset(vis, false, sizeof(vis));
    vec.clear();
    rbfs(i);
  }
  long long fa, fb, fc, fd;
  long long a, d;
  long long tot, mtot = 0;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < n; j++) {
      if (i == j) continue;
      for (long long ii = 0; ii < rv[i].size(); ii++) {
        a = rv[i][ii].first;
        for (long long jj = 0; jj < st[j].size(); jj++) {
          d = st[j][jj].first;
          if (valid(a, i, j, d) && dst[i][j] != -1) {
            tot = (dst[i][j] + rv[i][ii].second + st[j][jj].second);
            if (mtot < tot) {
              mtot = tot;
              fa = a;
              fb = i;
              fc = j;
              fd = d;
            }
          }
        }
      }
    }
  }
  cout << fa + 1 << " " << fb + 1 << " " << fc + 1 << " " << fd + 1 << endl;
}
