#include <bits/stdc++.h>
const int oo = 0x3f3f3f3f;
template <typename T>
inline bool chkmax(T &a, T b) {
  return a < b ? a = b, true : false;
}
template <typename T>
inline bool chkmin(T &a, T b) {
  return a > b ? a = b, true : false;
}
const int MAXN = 105;
const int MAXK = 105;
int N, M, K, A, B;
int G[MAXN][MAXN];
int S[MAXK], T[MAXK];
void input() {
  scanf("%d%d%d%d", &N, &M, &A, &B);
  memset(G, +oo, sizeof(G));
  for (int i = 1; i <= N; ++i) {
    G[i][i] = 0;
  }
  for (int i = 1; i <= M; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u][v] = 1;
  }
  scanf("%d", &K);
  for (int i = 1; i <= K; ++i) {
    scanf("%d%d", &S[i], &T[i]);
  }
}
int dis[MAXN][MAXN];
long long f1[MAXN], f2[MAXN];
int *d;
bool isKey[MAXK][MAXN];
int f[MAXN];
int flag[MAXN];
int ans[MAXN];
int thisIsFuckingMyClock_notYouFuckingSTL;
long long dfs1(int u) {
  if (f1[u] != -1) return f1[u];
  long long &ret = f1[u] = 0;
  for (int v = 1; v <= N; ++v) {
    if (G[u][v] == 1 && d[u] + 1 == d[v]) ret += dfs1(v);
  }
  return ret;
}
long long dfs2(int u) {
  if (f2[u] != -1) return f2[u];
  long long &ret = f2[u] = 0;
  for (int v = 1; v <= N; ++v) {
    if (G[v][u] == 1 && d[v] + 1 == d[u]) ret += dfs2(v);
  }
  return ret;
}
int dfsFuckYou(int u, int tgt) {
  if (flag[u] == thisIsFuckingMyClock_notYouFuckingSTL) return f[u];
  flag[u] = thisIsFuckingMyClock_notYouFuckingSTL;
  int &ret = f[u] = -1;
  for (int v = 1; v <= N; ++v) {
    if (G[u][v] == 1 && dis[u][tgt] == dis[v][tgt] + 1)
      chkmax(ret, dfsFuckYou(v, tgt));
  }
  if (ret == -1) ret = +oo;
  chkmin(ret, ans[u] + 1);
  return ret;
}
void solve() {
  memcpy(dis, G, sizeof(dis));
  for (int k = 1; k <= N; ++k) {
    for (int i = 1; i <= N; ++i) {
      for (int j = 1; j <= N; ++j) {
        chkmin(dis[i][j], dis[i][k] + dis[k][j]);
      }
    }
  }
  for (int i = 1; i <= K; ++i) {
    int s = S[i];
    int t = T[i];
    if (dis[s][t] == +oo) continue;
    d = dis[s];
    memset(f1, -1, sizeof(f1));
    f1[t] = 1;
    dfs1(s);
    memset(f2, -1, sizeof(f2));
    f2[s] = 1;
    dfs2(t);
    for (int j = 1; j <= N; ++j) {
      if (f1[j] != -1 && f1[j] * f2[j] == f1[s]) isKey[i][j] = true;
    }
  }
  memset(ans, +oo, sizeof(ans));
  ans[B] = 0;
  thisIsFuckingMyClock_notYouFuckingSTL = 0;
  for (;;) {
    bool modified = false;
    for (int i = 1; i <= K; ++i) {
      for (int j = 1; j <= N; ++j) {
        if (isKey[i][j]) {
          ++thisIsFuckingMyClock_notYouFuckingSTL;
          if (chkmin(ans[j], dfsFuckYou(j, T[i]))) modified = true;
        }
      }
    }
    if (!modified) break;
  }
  if (ans[A] == +oo)
    puts("-1");
  else
    printf("%d\n", ans[A]);
}
int main() {
  input();
  solve();
  return 0;
}
