#include <bits/stdc++.h>
using namespace std;
const int maxn = 205;
int n, m, K, T, dis[maxn][maxn], A, B, s[maxn], t[maxn];
int cnt, head[maxn], to[maxn * maxn], nex[maxn * maxn];
int tot[maxn], tmp[maxn], tp;
int stk[maxn], l;
bool bj[maxn][maxn];
int dp[maxn], DP[maxn], vis[maxn];
void add(int x, int y) {
  to[++cnt] = y;
  nex[cnt] = head[x];
  head[x] = cnt;
}
priority_queue<pair<int, int> > q;
void floyd() {
  for (int i = 1; i <= n; i++) dis[i][i] = 0;
  for (int k = 1; k <= n; k++) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
        dis[i][j] = min(dis[i][k] + dis[k][j], dis[i][j]);
      }
  }
}
void find(int u, int k) {
  stk[++l] = u;
  if (u == t[k]) {
    for (int i = 1; i <= l; i++) tot[stk[i]]++;
  }
  for (int i = head[u]; i; i = nex[i]) {
    int v = to[i];
    if (dis[v][t[k]] + 1 == dis[u][t[k]]) {
      find(v, k);
    }
  }
  l--;
}
int dfs(int u, int k) {
  if (vis[u] == T) return DP[u];
  int tmp = -1;
  vis[u] = T;
  for (int i = head[u]; i; i = nex[i]) {
    int v = to[i];
    if (dis[v][t[k]] + 1 == dis[u][t[k]]) {
      tmp = max(tmp, dfs(v, k));
    }
  }
  if (tmp == -1) tmp = 1e9;
  if (tmp > dp[u]) tmp = dp[u];
  return DP[u] = tmp;
}
signed main() {
  cin >> n >> m >> A >> B;
  memset(dis, 0x3f, sizeof(dis));
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
    dis[x][y] = 1;
  }
  floyd();
  cin >> K;
  for (int i = 1; i <= K; i++) cin >> s[i] >> t[i];
  for (int i = 1; i <= K; i++) {
    if (dis[s[i]][t[i]] > 1e9) continue;
    memset(tot, 0, sizeof(tot));
    find(s[i], i);
    tp = 0;
    tmp[++tp] = s[i];
    tmp[++tp] = t[i];
    bj[i][s[i]] = bj[i][t[i]] = 1;
    for (int j = 1; j <= n; j++) {
      if (j == s[i] || j == t[i]) continue;
      if (tot[j] == tot[t[i]]) bj[i][j] = 1;
    }
  }
  int flag = 1;
  memset(dp, 0x3f, sizeof(dp));
  memset(DP, 0x3f, sizeof(DP));
  dp[B] = 0;
  while (flag) {
    flag = 0;
    for (int i = 1; i <= K; i++) {
      for (int j = 1; j <= n; j++) {
        if (bj[i][j] == 0) continue;
        T++;
        int tmp = dfs(j, i) + 1;
        if (tmp < dp[j]) {
          dp[j] = tmp;
          flag = 1;
        }
      }
    }
  }
  if (dp[A] > 1e9) dp[A] = -1;
  cout << dp[A] << endl;
  return 0;
}
