#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T min(T &a, T &b) {
  return a < b ? a : b;
}
template <class T>
inline T max(T &a, T &b) {
  return a > b ? a : b;
}
template <class T>
void read(T &x) {
  char ch;
  while ((ch = getchar()) && !isdigit(ch))
    ;
  x = ch - '0';
  while ((ch = getchar()) && isdigit(ch)) x = x * 10 + ch - '0';
}
struct point {
  int x, y;
  point() {}
  point(int _x, int _y) : x(_x), y(_y) {}
};
long long Pow(long long a, long long b, long long mod) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
const int N = 200;
int n, m, K, dis[N][N], ti, ok[N][N], dp[N][N], vis[N], can[N], Vis[N][N],
    G[N][N];
vector<int> E[N], F[N], full[N], Road[N], Up[N];
int S, T;
void bfs(int st) {
  queue<int> Q;
  for (int i = 1; i <= n; i++) dis[ti][i] = ((~0U >> 1) - 3);
  dis[ti][st] = 0;
  Q.push(st);
  while (Q.size()) {
    int x = Q.front();
    Q.pop();
    for (int i = 0; i < E[x].size(); i++)
      if (dis[ti][E[x][i]] > dis[ti][x] + 1) {
        dis[ti][E[x][i]] = dis[ti][x] + 1;
        Q.push(E[x][i]);
      }
  }
}
void dfs(int x) {
  Vis[ti][x] = 1;
  if (vis[x] != ti) {
    full[ti].push_back(x);
    Road[dis[ti][x]].push_back(x);
  }
  vis[x] = ti;
  for (int i = 0; i < F[x].size(); i++)
    if (dis[ti][F[x][i]] == dis[ti][x] - 1) dfs(F[x][i]);
}
int dfs(int x, int y) {
  int ans = 0;
  for (int i = 1; i <= n; i++)
    if (Vis[y][i] && G[x][i] && dis[y][i] == dis[y][x] + 1)
      ans = max(ans, dfs(i, y));
  if (ans == 0) ans = ((~0U >> 1) - 3);
  ans = min(ans, dp[x][y]);
  ans = min(ans, can[x] + 1);
  return ans;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &S, &T);
  int x, y;
  if (S == T) {
    puts("0");
    return 0;
  }
  for (int i = 1; i <= m; i++)
    scanf("%d%d", &x, &y), E[x].push_back(y), F[y].push_back(x), G[x][y] = 1;
  scanf("%d", &K);
  for (int i = 1; i <= K; i++) {
    scanf("%d%d", &x, &y);
    ti = i;
    for (int j = 0; j <= n; j++) Road[j].clear();
    bfs(x);
    dfs(y);
    for (int j = 0; j <= n; j++)
      if (Road[j].size() == 1)
        Up[Road[j][0]].push_back(i), ok[Road[j][0]][i] = 1;
  }
  for (int i = 1; i <= n; i++) can[i] = ((~0U >> 1) - 3);
  for (int i = 1; i <= n; i++)
    for (int j = 0; j <= K; j++) dp[i][j] = ((~0U >> 1) - 3);
  for (int i = 0; i < Up[T].size(); i++) dp[T][Up[T][i]] = 1, can[T] = 1;
  while (1) {
    int F = 0;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= K; j++)
        if (ok[i][j] == 1) {
          int flag = 1, Max = 0, size = 0;
          Max = dfs(i, j);
          if (dp[i][j] > Max) {
            dp[i][j] = Max, can[i] = min(can[i], dp[i][j]), F = 1;
          }
        }
    if (!F) break;
  }
  int ans = ((~0U >> 1) - 3);
  for (int i = 1; i <= K; i++) ans = min(ans, dp[S][i]);
  if (ans == ((~0U >> 1) - 3))
    puts("-1");
  else
    printf("%d\n", ans);
}
