func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m, A, B, inf = 1e9, f[110][110], x, y, K, g[110][110], Cnt[110],                   d[110][110];   bool vis[110][110], V[110][110], Must[110][110];   vector<int> E1[110], E2[110], E[110][110];   queue<pair<int, int> > h;   void read(int &x) {     char ch = getchar();     int mark = 1;     for (; ch !=  -  && (ch <  0  || ch >  9 ); ch = getchar())       ;     if (ch ==  - ) mark = -1, ch = getchar();     for (x = 0; ch >=  0  && ch <=  9 ; ch = getchar()) x = x * 10 + ch - 48;     x *= mark;   }   int main() {     read(n);     read(m);     read(A);     read(B);     for (int i = 1; i <= n; i++)       for (int j = i + 1; j <= n; j++) f[i][j] = f[j][i] = inf;     for (int i = 1; i <= m; i++) {       read(x);       read(y);       f[x][y] = 1;       E1[x].push_back(y);       E2[y].push_back(x);     }     for (int k = 1; k <= n; k++)       for (int i = 1; i <= n; i++)         for (int j = 1; j <= n; j++) f[i][j] = min(f[i][j], f[i][k] + f[k][j]);     read(K);     for (int i = 1; i <= K; i++) {       read(x);       read(y);       int dis = f[x][y];       if (dis == inf) continue;       memset(Cnt, 0, sizeof(Cnt));       for (int j = 1; j <= n; j++)         if (f[x][j] + f[j][y] == dis) {           V[i][j] = 1;           Cnt[f[x][j]]++;           for (int k = 0; k < E1[j].size(); k++) {             int v = E1[j][k];             if (f[x][j] + 1 + f[v][y] == dis) E[i][v].push_back(j), d[i][j]++;           }         }       for (int j = 1; j <= n; j++)         if (V[i][j] && Cnt[f[x][j]] == 1) Must[i][j] = 1;     }     for (int i = 1; i <= K; i++)       if (V[i][B]) {         vis[B][i] = 1, g[B][i] = 1;         h.push(make_pair(B, i));       }     for (int _ = 1; _ <= K; _++) {       while (h.size()) {         pair<int, int> now = h.front();         h.pop();         int u = now.first, x = now.second;         for (int i = 0; i < E[x][u].size(); i++) {           int v = E[x][u][i];           d[x][v]--;           if (d[x][v] == 0 && !vis[v][x]) {             vis[v][x] = 1;             g[v][x] = g[u][x];             h.push(make_pair(v, x));           }         }       }       for (int i = 1; i <= K; i++)         if (vis[A][i] && Must[i][A]) {           printf( %d n , _);           return 0;         }       for (int i = 1; i <= n; i++)         for (int j = 1; j <= K; j++)           if (vis[i][j] && Must[j][i] && g[i][j] == _) {             for (int k = 1; k <= K; k++)               if (!vis[i][k] && V[k][i]) {                 g[i][k] = g[i][j] + 1;                 vis[i][k] = 1;                 h.push(make_pair(i, k));               }           }     }     printf( -1 n );     return 0;   }   