#include <bits/stdc++.h>
using namespace std;
int N, M, K, A, B;
int P1[102], P2[102];
int D[102][102], F[102];
int can[102][102];
bool is[102][102];
vector<int> V[102], W[102];
queue<int> Q;
int main() {
  cin >> N >> M >> A >> B;
  for (int i = 1, nod1, nod2; i <= M; ++i) {
    cin >> nod1 >> nod2;
    V[nod1].push_back(nod2);
    W[nod2].push_back(nod1);
  }
  memset(D, -1, sizeof(D));
  cin >> K;
  for (int i = 1; i <= K; ++i) {
    cin >> P1[i] >> P2[i];
    Q.push(P1[i]);
    D[i][P1[i]] = 0;
    while (!Q.empty()) {
      int now = Q.front();
      Q.pop();
      for (vector<int>::iterator it = V[now].begin(); it != V[now].end(); ++it)
        if (D[i][*it] == -1) {
          Q.push(*it);
          D[i][*it] = D[i][now] + 1;
        }
    }
    memset(D[0], -1, sizeof(D[0]));
    Q.push(P2[i]);
    D[0][P2[i]] = 0;
    while (!Q.empty()) {
      int now = Q.front();
      Q.pop();
      for (vector<int>::iterator it = W[now].begin(); it != W[now].end(); ++it)
        if (D[0][*it] == -1) {
          Q.push(*it);
          D[0][*it] = D[0][now] + 1;
        }
    }
    int totdist = D[i][P2[i]];
    for (int j = 1; j <= N; ++j) {
      if (D[i][j] == -1 || D[0][j] == -1)
        D[i][j] = -1;
      else if (D[i][j] + D[0][j] != totdist)
        D[i][j] = -1;
    }
    memset(F, 0, sizeof(F));
    for (int j = 1; j <= N; ++j)
      if (D[i][j] != -1) ++F[D[i][j]];
    for (int j = 1; j <= N; ++j)
      if (D[i][j] != -1 && F[D[i][j]] == 1) is[i][j] = true;
  }
  memset(can, -1, sizeof(can));
  for (int i = 1; i <= K; ++i)
    if (is[i][B]) can[B][i] = 1;
  bool change = true;
  while (change) {
    change = false;
    for (int i = 1; i <= N; ++i)
      for (int j = 1; j <= K; ++j)
        if (D[j][i] != -1) {
          bool all = true, any = false;
          int maxnow = 0;
          for (vector<int>::iterator it = V[i].begin(); it != V[i].end(); ++it)
            if (D[j][*it] != -1 && D[j][i] + 1 == D[j][*it]) {
              if (can[*it][j] == -1) {
                all = false;
                break;
              }
              maxnow = max(maxnow, can[*it][j]);
              any = true;
            }
          if (all && any) {
            if (can[i][j] == -1) {
              can[i][j] = maxnow;
              change = true;
            } else if (maxnow < can[i][j]) {
              can[i][j] = maxnow;
              change = true;
            }
          }
          for (int k = 1; k <= K; ++k)
            if (is[k][i] && can[i][k] != -1) {
              if (can[i][j] == -1) {
                can[i][j] = can[i][k] + 1;
                change = true;
              } else if (can[i][k] + 1 < can[i][j]) {
                can[i][j] = can[i][k] + 1;
                change = true;
              }
            }
        }
  }
  int result = -1;
  for (int i = 1; i <= K; ++i)
    if (is[i][A] && can[A][i] != -1) {
      if (result == -1)
        result = can[A][i];
      else if (can[A][i] < result)
        result = can[A][i];
    }
  cout << result << '\n';
}
