func_code_string: #include <bits/stdc++.h>   using namespace std;   void precalc(){};   const int N = 3010;   int n, m;   vector<vector<int>> g;   vector<vector<int>> dist;   pair<int, int> pre[N][3], post[N][3];   void bfs(int x) {     queue<int> q;     q.push(x);     while (q.size()) {       int head = q.front();       q.pop();       for (auto c : g[head]) {         if (dist[x][c] > n) {           dist[x][c] = dist[x][head] + 1;           q.push(c);         }       }     }   }   inline bool distinct(int a, int b, int c, int d) {     vector<int> z = {a, b, c, d};     sort(z.begin(), z.end());     return z[0] != z[1] && z[1] != z[2] && z[2] != z[3];   }   void solve(int ncase) {     cin >> n >> m;     g.assign(n + 1, vector<int>());     dist.assign(n + 1, vector<int>(n + 1, n + 1));     for (int i = 1; i <= n; i++) {       dist[i][i] = 0;     }     for (int i = 0; i < m; i++) {       int x, y;       cin >> x >> y;       g[x].push_back(y);     }     for (int i = 1; i <= n; i++) {       bfs(i);     }     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) {         if (dist[j][i] <= n) {           pair<int, int> tmppre = pair<int, int>(dist[j][i], j);           if (tmppre > pre[i][2]) {             pre[i][2] = tmppre;             if (pre[i][2] > pre[i][1]) {               swap(pre[i][2], pre[i][1]);               if (pre[i][1] > pre[i][0]) {                 swap(pre[i][1], pre[i][0]);               }             }           }         }         if (dist[i][j] <= n) {           pair<int, int> tmppost = pair<int, int>(dist[i][j], j);           if (tmppost > post[i][2]) {             post[i][2] = tmppost;             if (post[i][2] > post[i][1]) {               swap(post[i][2], post[i][1]);               if (post[i][1] > post[i][0]) {                 swap(post[i][1], post[i][0]);               }             }           }         }       }     }     int ans = -1;     vector<int> ret(4);     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) {         if (i == j || dist[i][j] > n) continue;         for (int a = 0; a < 3; a++) {           if (pre[i][a].second == 0) continue;           for (int b = 0; b < 3; b++) {             if (post[j][b].second == 0) continue;             int tmp = pre[i][a].first + dist[i][j] + post[j][b].first;             if (tmp > ans &&                 distinct(pre[i][a].second, i, j, post[j][b].second)) {               ans = tmp;               ret = {pre[i][a].second, i, j, post[j][b].second};             }           }         }       }     }     cout << ret[0] <<     << ret[1] <<     << ret[2] <<     << ret[3] << endl;   }   int main() {     int T = 1;     int ncase = 0;     while (T--) {       solve(++ncase);     }   }   