#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
using LL = long long;
constexpr int MAXN = 2e5 + 10;
int n, m, sp[MAXN], k, p[MAXN];
vector<int> G[MAXN], G2[MAXN];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    G2[u].push_back(v);
    G[v].push_back(u);
  }
  for (int i = 1; i <= n; i++) {
    sort(G[i].begin(), G[i].end());
    G[i].resize(unique(G[i].begin(), G[i].end()) - G[i].begin());
    sort(G2[i].begin(), G2[i].end());
    G2[i].resize(unique(G2[i].begin(), G2[i].end()) - G2[i].begin());
  }
  cin >> k;
  for (int i = 1; i <= k; i++) cin >> p[i];
  {
    queue<int> q;
    fill_n(sp + 1, n, 1e9);
    q.push(p[k]), sp[p[k]] = 0;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (int v : G[u]) {
        if (sp[u] + 1 < sp[v]) {
          sp[v] = sp[u] + 1, q.push(v);
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    sort(G2[i].begin(), G2[i].end(),
         [](int a, int b) { return sp[a] < sp[b]; });
  }
  int mx = 0, mn = 0;
  for (int i = 2; i <= k; i++) {
    int u = p[i - 1], v = p[i];
    if (sp[v] != sp[G2[u][0]]) ++mn;
    if (v == G2[u][0]) {
      if (G2[u].size() > 1 && sp[G2[u][0]] == sp[G2[u][1]]) ++mx;
    } else {
      ++mx;
    }
  }
  cout << mn << ' ' << mx << '\n';
  return 0;
}
