#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
struct Edge {
  int from, to;
};
vector<Edge> edges;
vector<int> G[maxn];
vector<int> nxt[maxn];
int dis[maxn], vis[maxn];
void Bfs(int s) {
  memset(vis, 0, sizeof(vis));
  memset(dis, 0x3f, sizeof(dis));
  queue<int> Q;
  Q.push(s);
  dis[s] = 0;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    if (!vis[u]) {
      vis[u] = 1;
      for (int i = 0; i < (int)G[u].size(); i++) {
        auto &e = edges[G[u][i]];
        if (dis[u] + 1 < dis[e.to]) {
          dis[e.to] = dis[u] + 1;
          nxt[e.to].clear();
          nxt[e.to].push_back(u);
        } else if (dis[u] + 1 == dis[e.to]) {
          nxt[e.to].push_back(u);
        }
        Q.push(e.to);
      }
    }
  }
}
int p[maxn];
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d %d", &v, &u);
    edges.push_back((Edge){u, v});
    G[u].push_back(edges.size() - 1);
  }
  int k;
  scanf("%d", &k);
  for (int i = 1; i <= k; i++) scanf("%d", p + i);
  Bfs(p[k]);
  int ans1 = 0, ans2 = 0;
  for (int i = 1; i < k; i++) {
    bool flag = false;
    for (auto it : nxt[p[i]]) {
      if (p[i + 1] == it) {
        flag = true;
        break;
      }
    }
    if (flag) {
      if (nxt[p[i]].size() > 1) ans2++;
    } else {
      ans1++;
      ans2++;
    }
  }
  printf("%d %d\n", ans1, ans2);
  getchar();
  getchar();
  return 0;
}
