#include <bits/stdc++.h>
#pragma GCC optimize "-O3"
using namespace std;
void dfs(vector<int> adj[], int sv, vector<bool> &vis, int &c) {
  vis[sv] = true;
  c++;
  for (long long i = (0); i < (adj[sv].size()); ++i) {
    if (!vis[adj[sv][i]]) {
      dfs(adj, adj[sv][i], vis, c);
    }
  }
}
void bfs(vector<int> adj[], int n, int sv, vector<int> &val) {
  vector<bool> vis(n + 1, false);
  queue<pair<int, int> > q;
  q.push({sv, 0});
  vis[sv] = true;
  while (!q.empty()) {
    pair<int, int> f = q.front();
    q.pop();
    val[f.first] = f.second;
    for (int i = 0; i < adj[f.first].size(); i++) {
      if (!vis[adj[f.first][i]]) {
        vis[adj[f.first][i]] = true;
        q.push({adj[f.first][i], f.second + 1});
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  int n, m;
  cin >> n >> m;
  vector<int> adj[n + 1];
  vector<int> rev[n + 1];
  for (long long i = (0); i < (m); ++i) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    rev[v].push_back(u);
  }
  int k;
  cin >> k;
  int p[k];
  for (long long i = (0); i < (k); ++i) cin >> p[i];
  vector<int> val(n + 1, -1);
  bfs(rev, n, p[k - 1], val);
  int mx = 0, mn = 0;
  for (long long i = (0); i < (k - 2); ++i) {
    int c1 = 0, c2 = 0;
    for (long long j = (0); j < (adj[p[i]].size()); ++j) {
      if (val[adj[p[i]][j]] != -1) {
        if (val[adj[p[i]][j]] < val[p[i + 1]])
          c1++;
        else if (val[adj[p[i]][j]] == val[p[i + 1]])
          c2++;
      }
    }
    if (c1 > 0 || c2 > 1) mx++;
    if (c1 > 0) {
      mn++;
    }
  }
  cout << mn << " " << mx;
  return 0;
}
