#include <bits/stdc++.h>
using namespace std;
const int Max_N(105);
const int Max_K(105);
int N, M, S, T, G[Max_N][Max_N], K, A[Max_K], B[Max_K], Cnt[Max_N];
bool Must[Max_K][Max_N];
int Dist[Max_N][Max_K];
bool InQ[Max_N][Max_K];
vector<pair<int, int> > Go[Max_N][Max_K];
bool update(int u, int x) {
  int Ret(0);
  if (u != B[x]) {
    for (int v = 1; v <= N; ++v)
      if (G[A[x]][v] + G[v][B[x]] == G[A[x]][B[x]] &&
          G[A[x]][v] == G[A[x]][u] + 1 && G[u][v] == 1)
        Ret = max(Ret, Dist[v][x]);
  } else
    Ret = 0X3F3F3F3F;
  for (int y = 1; y <= K; ++y)
    if (Must[y][u]) Ret = min(Ret, Dist[u][y] + 1);
  if (Ret < Dist[u][x]) return Dist[u][x] = Ret, true;
  return false;
}
int main() {
  scanf("%d%d%d%d", &N, &M, &S, &T);
  memset(G, 0X3F, sizeof(G));
  for (int i = 1; i <= N; ++i) G[i][i] = 0;
  for (int s, t; M--;) scanf("%d%d", &s, &t), G[s][t] = 1;
  for (int k = 1; k <= N; ++k)
    for (int i = 1; i <= N; ++i)
      for (int j = 1; j <= N; ++j) G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
  scanf("%d", &K);
  for (int i = 1; i <= K; ++i) {
    scanf("%d%d", A + i, B + i);
    if (G[A[i]][B[i]] > N) continue;
    memset(Cnt, 0, sizeof(Cnt));
    for (int u = 1; u <= N; ++u)
      if (G[A[i]][u] + G[u][B[i]] == G[A[i]][B[i]]) ++Cnt[G[A[i]][u]];
    for (int u = 1; u <= N; ++u)
      if (G[A[i]][u] + G[u][B[i]] == G[A[i]][B[i]] && Cnt[G[A[i]][u]] == 1)
        Must[i][u] = true;
  }
  queue<pair<int, int> > Q;
  for (int u = 1; u <= N; ++u)
    for (int x = 1; x <= K; ++x) {
      if (G[A[x]][B[x]] > N || G[A[x]][u] + G[u][B[x]] != G[A[x]][B[x]]) {
        Dist[u][x] = 0X3F3F3F3F;
        continue;
      }
      for (int y = 1; y <= K; ++y)
        if (Must[y][u]) Go[u][y].push_back(make_pair(u, x));
      for (int v = 1; v <= N; ++v)
        if (G[A[x]][v] + G[v][B[x]] == G[A[x]][B[x]] &&
            G[A[x]][v] == G[A[x]][u] + 1 && G[u][v] == 1)
          Go[v][x].push_back(make_pair(u, x));
      if ((Dist[u][x] = ((u == T) ? 0 : 0X3F3F3F3F)) == 0)
        Q.push(make_pair(u, x)), InQ[u][x] = true;
    }
  for (int u, x; Q.empty() == false;) {
    u = Q.front().first, x = Q.front().second, Q.pop(), InQ[u][x] = false;
    for (int i = 0, v, y; i < Go[u][x].size(); ++i) {
      v = Go[u][x][i].first, y = Go[u][x][i].second;
      if (update(v, y) && !InQ[v][y]) Q.push(make_pair(v, y)), InQ[v][y] = true;
    }
  }
  int Ans(0X3F3F3F3F);
  for (int x = 1; x <= K; ++x)
    if (Must[x][S]) Ans = min(Ans, Dist[S][x] + 1);
  if (Ans < 0X3F3F3F3F)
    printf("%d", Ans);
  else
    printf("-1");
  return 0;
}
