#include <bits/stdc++.h>
using namespace std;
long long GCD(long long a, long long b) { return b ? GCD(b, a % b) : a; }
long long LCM(long long a, long long b) { return a * b / GCD(a, b); }
const long long N = 2e5 + 7;
const int mod = 1e9 + 7;
const long long inf = 8e18 + 7;
long long n, m, ex[N], ey[N], head[N], k, p[N], tot, dis[N];
struct node {
  long long to, nxt;
} e[N];
void addedge(long long x, long long y) {
  e[++tot].to = y;
  e[tot].nxt = head[x];
  head[x] = tot;
}
void bfs(long long s) {
  queue<long long> q;
  q.push(s);
  memset(dis, 0, sizeof dis);
  dis[s] = 1;
  while (!q.empty()) {
    long long x = q.front();
    q.pop();
    for (int j = head[x]; j; j = e[j].nxt) {
      int y = e[j].to;
      if (dis[y] == 0) {
        dis[y] = dis[x] + 1;
        q.push(y);
      }
    }
  }
}
int main() {
  cin >> n >> m;
  tot = 0;
  for (int i = 1; i <= m; i++) {
    cin >> ex[i] >> ey[i];
    addedge(ey[i], ex[i]);
  }
  cin >> k;
  for (int i = 1; i <= k; i++) cin >> p[i];
  bfs(p[k]);
  memset(head, 0, sizeof head);
  tot = 0;
  for (int i = 1; i <= m; i++) addedge(ex[i], ey[i]);
  long long mx = 0, mi = 0;
  for (int i = 1; i < k; i++) {
    if (dis[p[i]] != dis[p[i + 1]] + 1)
      mx++, mi++;
    else {
      for (int j = head[p[i]]; j; j = e[j].nxt) {
        int y = e[j].to;
        if (dis[y] == dis[p[i + 1]] && y != p[i + 1]) {
          mx++;
          break;
        }
      }
    }
  }
  cout << mi << " " << mx << "\n";
  return 0;
}
