#include <bits/stdc++.h>
using namespace std;
const int maxn = 200005, maxm = 200005;
int n, m, k, mx, mn;
int p[maxn], d[maxn], num[maxn];
int en, h[maxn];
bool vis[maxn];
inline int read() {
  int x = 0;
  char ch = getchar();
  bool flag = true;
  while (ch < '0' or ch > '9') {
    if (flag == '-') flag = false;
    ch = getchar();
  }
  while (ch >= '0' and ch <= '9') {
    x = x * 10 + ch - 48;
    ch = getchar();
  }
  return flag ? x : -x;
}
struct Edge {
  int u;
  int v;
  int next;
};
Edge e[2 * maxm];
void addedge(int u, int v) {
  en++;
  e[en].u = u;
  e[en].v = v;
  e[en].next = h[u];
  h[u] = en;
  return;
}
void bfs() {
  for (int i = 1; i <= n; i++) d[i] = 0x7fffffff;
  queue<int> q;
  q.push(p[k]);
  d[p[k]] = 0;
  while (!q.empty()) {
    int tmp = q.front();
    q.pop();
    vis[tmp] = true;
    for (int i = h[tmp]; i != 0; i = e[i].next) {
      int v = e[i].v;
      if (vis[v]) continue;
      if (d[tmp] + 1 < d[v]) {
        d[v] = d[tmp] + 1;
        q.push(v);
      } else if (d[tmp] + 1 == d[v])
        num[v]++;
    }
  }
  return;
}
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= m; i++) {
    int u, v;
    u = read();
    v = read();
    addedge(v, u);
  }
  k = read();
  for (int i = 1; i <= k; i++) p[i] = read();
  bfs();
  for (int i = 1; i < k; i++)
    if (d[p[i]] - 1 == d[p[i + 1]])
      mx += min(num[p[i]], 1);
    else {
      mx++;
      mn++;
    }
  printf("%d %d\n", mn, mx);
  return 0;
}
