#include <bits/stdc++.h>
using namespace std;
const int P = 998244353;
const int INF = 0x3f3f3f3f;
const long long INFLL = 0x3f3f3f3f3f3f3f3fll;
const int N = 2e5 + 5;
struct edge {
  int v;
  edge *next;
} pool[5 * N], *h[N], *h2[N];
int top = -1;
int n, m, k, ans1, ans2;
int a[N], dis[N];
queue<int> Q;
vector<int> V[N];
inline void addedge(int u, int v) {
  edge *tmp = &pool[++top];
  tmp->v = v;
  tmp->next = h[u];
  h[u] = tmp;
  tmp = &pool[++top];
  tmp->v = u;
  tmp->next = h2[v];
  h2[v] = tmp;
}
void init() {
  int u, v;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &u, &v);
    addedge(v, u);
  }
  v = 0;
  cin >> k;
  for (int i = 1; i <= k; i++) {
    scanf("%d", &u);
    a[v] = u;
    v = u;
  }
  for (int i = 1; i <= n; i++) dis[i] = INF;
  Q.push(u);
  dis[u] = 0;
  while (Q.empty() == false) {
    u = Q.front();
    Q.pop();
    for (edge *tmp = h[u]; tmp; tmp = tmp->next) {
      int v = tmp->v;
      if (dis[v] == INF) dis[v] = dis[u] + 1, Q.push(v), V[dis[v]].push_back(v);
    }
  }
  for (int i = 1; i <= n; i++) {
    for (auto u : V[i]) {
      int cnt = 0, ava = 0;
      for (edge *tmp = h2[u]; tmp; tmp = tmp->next) {
        int v = tmp->v;
        if (dis[v] == dis[u] - 1) {
          cnt++;
          if (v == a[u]) ava++;
        }
      }
      if (cnt == 1 && ava == 1) ans2++;
      if (ava == 1) ans1++;
    }
  }
  printf("%d %d\n", k - 1 - ans1, k - 1 - ans2);
}
int main() {
  init();
  return 0;
}
