#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
const int inf = INT_MAX / 4;
int n, m, k, s[MAXN], t[MAXN], d[MAXN][MAXN], a, b, h[MAXN], dp[MAXN][MAXN];
vector<int> maybe[MAXN], must[MAXN], adj[MAXN], nxt[MAXN][MAXN];
bool visit[MAXN];
inline void get() {
  cin >> n >> m >> a >> b;
  a--;
  b--;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    d[u][v] = 1;
    adj[u].push_back(v);
  }
  cin >> k;
  for (int i = 0; i < k; i++) {
    cin >> s[i] >> t[i];
    s[i]--;
    t[i]--;
  }
  return;
}
inline void floyd() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) d[i][j] = ((d[i][j] || i == j) ? d[i][j] : inf);
  for (int h = 0; h < n; h++)
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) d[i][j] = min(d[i][j], d[i][h] + d[h][j]);
  return;
}
inline bool mustcome(int r, int ind) {
  if (r == s[ind] || r == t[ind]) return true;
  for (int i = 0; i < n; i++) h[i] = 0, visit[i] = false;
  visit[s[ind]] = true;
  queue<int> q;
  q.push(s[ind]);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (int u : adj[v])
      if (u != r && !visit[u]) {
        visit[u] = true;
        h[u] = h[v] + 1;
        q.push(u);
      }
  }
  return (!visit[t[ind]] || (h[t[ind]] > d[s[ind]][t[ind]]));
}
inline void prep() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < k; j++) {
      if (d[s[j]][t[j]] != inf && d[s[j]][i] + d[i][t[j]] == d[s[j]][t[j]])
        maybe[j].push_back(i);
      if (mustcome(i, j)) must[i].push_back(j);
    }
  for (int j = 0; j < k; j++)
    for (int v : maybe[j])
      for (int u : maybe[j])
        if (u != v && d[s[j]][v] + 1 == d[s[j]][u] && d[v][u] == 1)
          nxt[v][j].push_back(u);
  return;
}
inline void calc() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < k; j++) dp[i][j] = inf;
  for (int j = 0; j < k; j++) dp[b][j] = 0;
  bool upd = true;
  while (upd) {
    upd = false;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < k; j++) {
        int tmp = -1;
        for (int u : nxt[i][j]) tmp = max(tmp, dp[u][j]);
        if (tmp != -1 && tmp < dp[i][j]) dp[i][j] = tmp, upd = true;
        for (int y : must[i])
          if (y != j && dp[i][y] + 1 < dp[i][j])
            dp[i][j] = dp[i][y] + 1, upd = true;
      }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  get();
  floyd();
  prep();
  calc();
  int ans = inf;
  for (int j : must[a]) ans = min(ans, dp[a][j]);
  cout << (ans >= inf ? -1 : ans + 1) << '\n';
  return 0;
}
