#include <bits/stdc++.h>   using namespace std;   vector<int> v1[3010], v2[3010];   int dista[3010][3010], distb[3010][3010];   pair<int, int> besta[3010][3], bestb[3010][3];   int n, m;   void dijkstra(int x) {     for (int i = 1; i <= n; i++) dista[x][i] = 1000000009;     dista[x][x] = 0;     priority_queue<pair<int, int> > q;     q.push(make_pair(0, x));     while (!q.empty()) {       pair<int, int> t = q.top();       q.pop();       int u = t.second;       for (int i = 0; i < v1[u].size(); i++) {         if (dista[x][v1[u][i]] > dista[x][u] + 1) {           dista[x][v1[u][i]] = dista[x][u] + 1;           q.push(make_pair(-dista[x][v1[u][i]], v1[u][i]));         }       }     }     for (int i = 1; i <= n; i++) {       if (dista[x][i] != 1000000009 && dista[x][i] > besta[x][0].first)         besta[x][2] = besta[x][1], besta[x][1] = besta[x][0],         besta[x][0] = make_pair(dista[x][i], i);       else if (dista[x][i] != 1000000009 && dista[x][i] > besta[x][1].first)         besta[x][2] = besta[x][1], besta[x][1] = make_pair(dista[x][i], i);       else if (dista[x][i] != 1000000009 && dista[x][i] > besta[x][2].first)         besta[x][2] = make_pair(dista[x][i], i);     }   }   void dijkstra2(int x) {     for (int i = 1; i <= n; i++) distb[x][i] = 1000000009;     distb[x][x] = 0;     priority_queue<pair<int, int> > q;     q.push(make_pair(0, x));     while (!q.empty()) {       pair<int, int> t = q.top();       q.pop();       int u = t.second;       for (int i = 0; i < v2[u].size(); i++) {         if (distb[x][v2[u][i]] > distb[x][u] + 1) {           distb[x][v2[u][i]] = distb[x][u] + 1;           q.push(make_pair(-distb[x][v2[u][i]], v2[u][i]));         }       }     }     for (int i = 1; i <= n; i++) {       if (distb[x][i] != 1000000009 && distb[x][i] > bestb[x][0].first)         bestb[x][2] = bestb[x][1], bestb[x][1] = bestb[x][0],         bestb[x][0] = make_pair(distb[x][i], i);       else if (distb[x][i] != 1000000009 && distb[x][i] > bestb[x][1].first)         bestb[x][2] = bestb[x][1], bestb[x][1] = make_pair(distb[x][i], i);       else if (distb[x][i] != 1000000009 && distb[x][i] > bestb[x][2].first)         bestb[x][2] = make_pair(distb[x][i], i);     }   }   int main() {     cin >> n >> m;     for (int i = 1; i <= m; i++) {       int x, y;       scanf( %d%d , &x, &y);       v1[x].push_back(y);       v2[y].push_back(x);     }     int ans = -1, ansa, ansb, ansc, ansd;     for (int i = 1; i <= n; i++) dijkstra(i);     for (int i = 1; i <= n; i++) dijkstra2(i);     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) {         for (int a = 0; a < 3; a++) {           for (int d = 0; d < 3; d++) {             int aa = bestb[i][a].second, dd = besta[j][d].second;             if (aa == 0 || dd == 0) continue;             if (i == j || i == aa || i == dd || j == aa || j == dd || aa == dd)               continue;             if (bestb[i][a].first == 1000000009 ||                 besta[j][d].first == 1000000009 || dista[i][j] == 1000000009)               continue;             int val = bestb[i][a].first + besta[j][d].first + dista[i][j];             if (val > ans) {               ans = val;               ansa = aa;               ansb = i;               ansc = j;               ansd = dd;             }           }         }       }     }     cout << ansa <<     << ansb <<     << ansc <<     << ansd << endl;     return 0;   }