#include <bits/stdc++.h>
using namespace std;
const int maxn = 110, INF = 1e9;
long long n, m, a, b, k, s[maxn], t[maxn], dist[maxn][maxn], dis[maxn],
    ans[maxn];
vector<int> vec[maxn], edges[maxn];
queue<int> q;
bool mark[maxn], vis[maxn];
inline void setdist() {
  for (int i = 0; i < maxn; ++i) {
    for (int j = 0; j < maxn; ++j) {
      dist[i][j] = ((i == j) ? 0 : INF);
    }
  }
}
inline void getdist() {
  for (int p = 0; p < n; ++p) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        dist[i][j] = min(dist[i][j], dist[i][p] + dist[p][j]);
      }
    }
  }
}
inline bool setvec(int i, int v) {
  for (int j = 0; j < n; ++j) {
    mark[j] = 0;
    dis[j] = INF;
  }
  q.push(s[i]);
  mark[s[i]] = 1;
  dis[s[i]] = 0;
  while (!q.empty()) {
    int u = q.front();
    for (auto x : edges[u]) {
      if (!mark[x] && x != v && dis[u] + 1 < dis[x]) {
        mark[x] = 1;
        dis[x] = dis[u] + 1;
        q.push(x);
      }
    }
    q.pop();
  }
  if (dis[t[i]] > dist[s[i]][t[i]]) return 1;
  return 0;
}
inline void bfs(int v, int d) {
  for (int i = 0; i < n; ++i) {
    mark[i] = 0;
    dis[i] = INF;
  }
  q.push(v);
  mark[v] = 1;
  dis[v] = 0;
  while (!q.empty()) {
    int u = q.front();
    for (auto x : edges[u]) {
      if (!mark[x] && (ans[x] >= d || ans[x] == -1) && dis[u] + 1 < dis[x]) {
        mark[x] = 1;
        dis[x] = dis[u] + 1;
        q.push(x);
      }
    }
    q.pop();
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m >> a >> b;
  a--;
  b--;
  setdist();
  for (int i = 0; i < m; ++i) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    edges[x].push_back(y);
    dist[x][y] = 1;
  }
  getdist();
  cin >> k;
  for (int i = 0; i < k; ++i) {
    cin >> s[i] >> t[i];
    s[i]--;
    t[i]--;
  }
  for (int i = 0; i < k; ++i) {
    for (int v = 0; v < n; ++v) {
      if ((v == s[i]) || (v == t[i])) {
        vec[v].push_back(i);
        continue;
      }
      bool is = setvec(i, v);
      if (is) {
        vec[v].push_back(i);
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    sort(vec[i].begin(), vec[i].end());
  }
  memset(ans, -1, sizeof(ans));
  ans[b] = 0;
  vis[b] = 1;
  for (int d = 1; d < n; ++d) {
    vector<int> res;
    for (int v = 0; v < n; ++v) {
      if (vis[v]) {
        continue;
      }
      bfs(v, d);
      for (int i : vec[v]) {
        if (dis[t[i]] > dist[v][t[i]]) {
          res.push_back(v);
        }
      }
    }
    for (auto u : res) {
      ans[u] = d;
      vis[u] = 1;
    }
  }
  cout << ans[a] << endl;
}
