func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<pair<int, int> > edge;   int flo[120][120], flo2[120][120], dp[120][120], menda[120][120], com;   int st[120], en[120];   vector<int> vc[120];   void sho(int n) {     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) {         if (i == j) continue;         flo[i][j] = 1e7;       }     }     for (int i = 0; i < edge.size(); i++) {       flo[edge[i].first][edge[i].second] = 1;     }     for (int k = 1; k <= n; k++) {       for (int i = 1; i <= n; i++) {         for (int j = 1; j <= n; j++) {           flo[i][j] = min(flo[i][k] + flo[k][j], flo[i][j]);         }       }     }   }   void sho2(int n, int stop) {     memset(flo2, 0, sizeof flo2);     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) {         if (i == j && i != stop) continue;         flo2[i][j] = 1e7;       }     }     for (int i = 0; i < edge.size(); i++) {       if (edge[i].first == stop || edge[i].second == stop) continue;       flo2[edge[i].first][edge[i].second] = 1;     }     for (int k = 1; k <= n; k++) {       if (k == stop) continue;       for (int i = 1; i <= n; i++) {         if (i == stop) continue;         for (int j = 1; j <= n; j++) {           if (j == stop) continue;           flo2[i][j] = min(flo2[i][k] + flo2[k][j], flo2[i][j]);         }       }     }   }   void dp_func(int v, int bus, int x, int y) {     int f = -1;     for (int i = 0; i < vc[v].size(); i++) {       int w = vc[v][i];       if (flo[v][y] == flo[w][y] + 1) f = max(f, dp[w][bus]);     }     if (f == -1) f = 1e7;     for (int i = 1; i <= com; i++) {       if (bus == i) continue;       int c = st[i], d = en[i];       if (flo[c][d] == 1e7) continue;       if (menda[i][v] == 0) continue;       f = min(f, dp[v][i] + 1);     }     dp[v][bus] = min(f, dp[v][bus]);   }   int main() {     int i, j, k, l, n, m, a, b;     scanf( %d%d%d%d , &n, &m, &a, &b);     for (int i = 1; i <= m; i++) {       scanf( %d%d , &l, &k);       edge.push_back(make_pair(l, k));       vc[l].push_back(k);     }     sho(n);     if (flo[a][b] == 1e7) {       cout <<  -1 ;       return 0;     }     scanf( %d , &com);     for (int i = 1; i <= com; i++) {       scanf( %d%d , &st[i], &en[i]);     }     for (int i = 1; i <= n; i++) {       sho2(n, i);       for (int j = 1; j <= com; j++) {         int x = st[j], y = en[j];         if (flo[x][y] < flo2[x][y]) menda[j][i] = 1;       }     }     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= com; j++) dp[i][j] = 1e7;     }     for (int j = 1; j <= com; j++) {       if (flo[st[j]][en[j]] == 1e7) continue;       if (menda[j][b]) dp[b][j] = 0;     }     for (int ite = 1; ite <= n; ite++) {       for (int i = 1; i <= n; i++) {         for (int j = 1; j <= com; j++) {           int x = st[j], y = en[j];           if (flo[x][y] == 1e7) continue;           dp_func(i, j, x, y);         }       }     }     int ans = 1e7;     for (int j = 1; j <= com; j++) {       if (!menda[j][a]) continue;       ans = min(ans, dp[a][j]);     }     if (ans == 1e7)       ans = -1;     else       ans++;     cout << ans << endl;   }   