#include <bits/stdc++.h>
using namespace std;
int f[109][109], n, m, s, t, b_num, dp[109], vis[109], Dp[109], T;
map<int, int> mp;
struct bus {
  int s, t;
  int vis[109];
  vector<int> q;
  void st() {
    memset(vis, 0, sizeof(vis));
    int cnt = 0;
    for (int now : q) vis[now] = f[s][now] + 1;
  }
} b[109];
int dfs(int x, int pos) {
  if (vis[x] == T) return Dp[x];
  vis[x] = T;
  int ret = -1;
  for (int i = 1; i <= n; i++)
    if (f[x][i] == 1 && 1 + f[i][b[pos].t] == f[x][b[pos].t])
      ret = max(ret, dfs(i, pos));
  if (ret == -1) ret = 1e9;
  ret = min(ret, dp[x]);
  return Dp[x] = ret;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m >> s >> t;
  memset(f, 0x3f, sizeof(f));
  for (int i = 1; i <= n; i++) f[i][i] = 0;
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    f[x][y] = 1;
  }
  cin >> b_num;
  for (int i = 1; i <= b_num; i++) cin >> b[i].s >> b[i].t;
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        if (f[i][k] + f[k][j] < f[i][j]) f[i][j] = f[i][k] + f[k][j];
  for (int i = 1; i <= b_num; i++) {
    mp.clear();
    if (f[b[i].s][b[i].t] > n) continue;
    for (int j = 1; j <= n; j++)
      if (f[b[i].s][b[i].t] == f[b[i].s][j] + f[j][b[i].t]) mp[f[b[i].s][j]]++;
    for (int j = 1; j <= n; j++)
      if (f[b[i].s][b[i].t] == f[b[i].s][j] + f[j][b[i].t] &&
          mp[f[b[i].s][j]] == 1)
        b[i].q.push_back(j);
    b[i].st();
  }
  memset(dp, 0x3f, sizeof(dp));
  dp[t] = 0;
  int flag = 1;
  while (flag) {
    flag = 0;
    for (int i = 1; i <= b_num; i++)
      for (int j = 1; j <= n; j++)
        if (b[i].vis[j]) {
          T++;
          int tmp = dfs(j, i) + 1;
          if (tmp < dp[j]) {
            flag = 1;
            dp[j] = tmp;
          }
        }
  }
  if (dp[s] > n)
    puts("-1");
  else
    cout << dp[s] << endl;
  return 0;
}
