#include <bits/stdc++.h>
using namespace std;
const int MAX = 109, INF = 1e9;
vector<int> bus[MAX][MAX], g[MAX];
int dis[MAX][MAX], ted[MAX], pos[MAX][MAX], n, m, st, en, k, bes = INF;
bool been[MAX], big[MAX][MAX];
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m >> st >> en, st--, en--;
  memset(dis, 63, sizeof dis);
  for (int i = 0, v, u; i < m; i++)
    cin >> v >> u, v--, u--, g[v].push_back(u), dis[v][u] = 1;
  for (int i = 0; i < n; i++) dis[i][i] = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        dis[j][k] = min(dis[j][k], dis[j][i] + dis[i][k]);
  cin >> k;
  for (int i = 0, v, u; i < k; i++) {
    cin >> v >> u, v--, u--;
    if (dis[v][u] > INF) continue;
    memset(ted, 0, sizeof ted), memset(been, 0, sizeof been);
    for (int j = 0; j < n; j++)
      if (dis[v][j] + dis[j][u] == dis[v][u]) been[j] = 1, ted[dis[v][j]]++;
    for (int j = 0; j < n; j++)
      if (been[j] && ted[dis[v][j]] == 1) big[j][i] = 1;
    for (int j = 0; j < n; j++)
      if (been[j])
        for (auto uu : g[j])
          if (been[uu] && dis[v][j] + 1 == dis[v][uu]) bus[j][i].push_back(uu);
  }
  memset(pos, 63, sizeof pos);
  for (int i = 0; i < k; i++) pos[en][i] = 1;
  for (int tof = 0; tof < 2 * MAX; tof++)
    for (int i = 0; i < n; i++)
      for (int j = 0; j < k; j++) {
        for (int ss = 0; ss < k; ss++)
          if (big[i][ss]) pos[i][j] = min(pos[i][j], pos[i][ss] + 1);
        int mx = 0;
        for (auto u : bus[i][j]) mx = max(mx, pos[u][j]);
        if (bus[i][j].size()) pos[i][j] = min(pos[i][j], mx);
      }
  for (int i = 0; i < k; i++)
    if (big[st][i]) bes = min(bes, pos[st][i]);
  if (bes == INF)
    cout << -1;
  else
    cout << bes;
}
