#include <bits/stdc++.h>
using namespace std;
const int N = 110, inf = 1e6;
int dis[N][N], dp[N], mem[N], s[N], t[N], n, m, a, b;
vector<int> V[N];
void init() {
  for (int i = 0; i < N; i++) V[i].clear(), mem[i] = inf;
  return;
}
void relax(int src, int sink) {
  init();
  mem[sink] = dp[sink];
  if (dis[src][sink] == inf) return;
  for (int u = 1; u <= n; u++) {
    if (dis[src][u] + dis[u][sink] == dis[src][sink])
      V[dis[u][sink]].push_back(u);
  }
  for (int i = 0; i <= dis[src][sink]; i++) {
    for (int v : V[i]) {
      mem[v] = -1;
      for (int u = 1; u <= n; u++)
        if (dis[v][u] == 1 && dis[src][v] + dis[u][sink] + 1 == dis[src][sink])
          mem[v] = max(mem[v], mem[u]);
      if (mem[v] == -1) mem[v] = dp[v];
      mem[v] = min(dp[v], mem[v]);
    }
    if (V[i].size() == 1) dp[V[i][0]] = min(mem[V[i][0]] + 1, dp[V[i][0]]);
  }
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m >> a >> b;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (i != j) dis[i][j] = inf;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    dis[u][v] = 1;
  }
  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][j], dis[i][k] + dis[k][j]);
  int k;
  cin >> k;
  for (int i = 0; i < k; i++) cin >> s[i] >> t[i];
  fill(dp, dp + N, inf);
  dp[b] = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < k; j++) relax(s[j], t[j]);
  cout << (dp[a] == inf ? -1 : dp[a]) << "\n";
}
