#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
vector<int> g2[MAXN];
vector<pair<int, int> > g[MAXN];
long long int dist[MAXN];
void dijkstra(int x) {
  memset(dist, -1, sizeof(dist));
  priority_queue<pair<long long int, int> > q;
  dist[x] = 0;
  q.push({0, x});
  while (!q.empty()) {
    x = q.top().second;
    long long int c = -q.top().first;
    q.pop();
    if (dist[x] != c) continue;
    for (int i = 0, colchin = g[x].size(); i < colchin; ++i) {
      int y = g[x][i].first;
      long long int c = g[x][i].second;
      if (dist[y] < 0 || dist[x] + c < dist[y])
        dist[y] = dist[x] + c, q.push({-dist[y], y});
    }
  }
}
int n, m, k;
int path[MAXN];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0, colchin = m; i < colchin; ++i) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    g[v].push_back(pair<int, int>(u, 1));
    g2[u].push_back(v);
  }
  cin >> k;
  for (int i = 0, colchin = k; i < colchin; ++i) {
    int p;
    cin >> p;
    p--;
    path[i] = p;
  }
  dijkstra(path[k - 1]);
  int minimum = 0;
  int maximum = 0;
  for (int i = 1, colchin = k; i < colchin; ++i)
    if (dist[path[i - 1]] <= dist[path[i]]) minimum++;
  for (int i = 0, colchin = k; i < colchin; ++i) {
    int cnt = 0;
    int minimumNode = -1;
    for (int u : g2[path[i]]) {
      if (dist[path[i]] - 1 == dist[u]) {
        cnt++;
        minimumNode = u;
      }
    }
    if (cnt > 1) {
      maximum++;
    } else if (cnt == 1) {
      if (i + 1 < k && path[i + 1] != minimumNode) {
        maximum++;
      }
    }
  }
  cout << minimum << " " << maximum << "\n";
  return 0;
}
