#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > edge;
int flo[120][120], flo2[120][120], dp[120][120], menda[120][120], com;
int st[120], en[120];
vector<int> vc[120];
void sho(int n) {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      flo[i][j] = 1e7;
    }
  }
  for (int i = 0; i < edge.size(); i++) {
    flo[edge[i].first][edge[i].second] = 1;
  }
  for (int k = 1; k <= n; k++) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        flo[i][j] = min(flo[i][k] + flo[k][j], flo[i][j]);
      }
    }
  }
}
void sho2(int n, int stop) {
  memset(flo2, 0, sizeof flo2);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j && i != stop) continue;
      flo2[i][j] = 1e7;
    }
  }
  for (int i = 0; i < edge.size(); i++) {
    if (edge[i].first == stop || edge[i].second == stop) continue;
    flo2[edge[i].first][edge[i].second] = 1;
  }
  for (int k = 1; k <= n; k++) {
    if (k == stop) continue;
    for (int i = 1; i <= n; i++) {
      if (i == stop) continue;
      for (int j = 1; j <= n; j++) {
        if (j == stop) continue;
        flo2[i][j] = min(flo2[i][k] + flo2[k][j], flo2[i][j]);
      }
    }
  }
}
void dp_func(int v, int bus, int x, int y) {
  int f = -1;
  for (int i = 0; i < vc[v].size(); i++) {
    int w = vc[v][i];
    if (flo[v][y] == flo[w][y] + 1) f = max(f, dp[w][bus]);
  }
  if (f == -1) f = 1e7;
  for (int i = 1; i <= com; i++) {
    if (bus == i) continue;
    int c = st[i], d = en[i];
    if (flo[c][d] == 1e7) continue;
    if (menda[i][v] == 0) continue;
    f = min(f, dp[v][i] + 1);
  }
  dp[v][bus] = min(f, dp[v][bus]);
}
int main() {
  int i, j, k, l, n, m, a, b;
  scanf("%d%d%d%d", &n, &m, &a, &b);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &l, &k);
    edge.push_back(make_pair(l, k));
    vc[l].push_back(k);
  }
  sho(n);
  if (flo[a][b] == 1e7) {
    cout << "-1";
    return 0;
  }
  scanf("%d", &com);
  for (int i = 1; i <= com; i++) {
    scanf("%d%d", &st[i], &en[i]);
  }
  for (int i = 1; i <= n; i++) {
    sho2(n, i);
    for (int j = 1; j <= com; j++) {
      int x = st[j], y = en[j];
      if (flo[x][y] < flo2[x][y]) menda[j][i] = 1;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= com; j++) dp[i][j] = 1e7;
  }
  for (int j = 1; j <= com; j++) {
    if (flo[st[j]][en[j]] == 1e7) continue;
    if (menda[j][b]) dp[b][j] = 0;
  }
  for (int ite = 1; ite <= n; ite++) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= com; j++) {
        int x = st[j], y = en[j];
        if (flo[x][y] == 1e7) continue;
        dp_func(i, j, x, y);
      }
    }
  }
  int ans = 1e7;
  for (int j = 1; j <= com; j++) {
    if (!menda[j][a]) continue;
    ans = min(ans, dp[a][j]);
  }
  if (ans == 1e7)
    ans = -1;
  else
    ans++;
  cout << ans << endl;
}
