#include <bits/stdc++.h>
using namespace std;
int n, m, A, B, inf = 1e9, f[110][110], x, y, K, g[110][110], Cnt[110],
                d[110][110];
bool vis[110][110], V[110][110], Must[110][110];
vector<int> E1[110], E2[110], E[110][110];
queue<pair<int, int> > h;
void read(int &x) {
  char ch = getchar();
  int mark = 1;
  for (; ch != '-' && (ch < '0' || ch > '9'); ch = getchar())
    ;
  if (ch == '-') mark = -1, ch = getchar();
  for (x = 0; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - 48;
  x *= mark;
}
int main() {
  read(n);
  read(m);
  read(A);
  read(B);
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) f[i][j] = f[j][i] = inf;
  for (int i = 1; i <= m; i++) {
    read(x);
    read(y);
    f[x][y] = 1;
    E1[x].push_back(y);
    E2[y].push_back(x);
  }
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
  read(K);
  for (int i = 1; i <= K; i++) {
    read(x);
    read(y);
    int dis = f[x][y];
    if (dis == inf) continue;
    memset(Cnt, 0, sizeof(Cnt));
    for (int j = 1; j <= n; j++)
      if (f[x][j] + f[j][y] == dis) {
        V[i][j] = 1;
        Cnt[f[x][j]]++;
        for (int k = 0; k < E1[j].size(); k++) {
          int v = E1[j][k];
          if (f[x][j] + 1 + f[v][y] == dis) E[i][v].push_back(j), d[i][j]++;
        }
      }
    for (int j = 1; j <= n; j++)
      if (V[i][j] && Cnt[f[x][j]] == 1) Must[i][j] = 1;
  }
  for (int i = 1; i <= K; i++)
    if (V[i][B]) {
      vis[B][i] = 1, g[B][i] = 1;
      h.push(make_pair(B, i));
    }
  for (int _ = 1; _ <= K; _++) {
    while (h.size()) {
      pair<int, int> now = h.front();
      h.pop();
      int u = now.first, x = now.second;
      for (int i = 0; i < E[x][u].size(); i++) {
        int v = E[x][u][i];
        d[x][v]--;
        if (d[x][v] == 0 && !vis[v][x]) {
          vis[v][x] = 1;
          g[v][x] = g[u][x];
          h.push(make_pair(v, x));
        }
      }
    }
    for (int i = 1; i <= K; i++)
      if (vis[A][i] && Must[i][A]) {
        printf("%d\n", _);
        return 0;
      }
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= K; j++)
        if (vis[i][j] && Must[j][i] && g[i][j] == _) {
          for (int k = 1; k <= K; k++)
            if (!vis[i][k] && V[k][i]) {
              g[i][k] = g[i][j] + 1;
              vis[i][k] = 1;
              h.push(make_pair(i, k));
            }
        }
  }
  printf("-1\n");
  return 0;
}
