#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;   }