#include <bits/stdc++.h>
using namespace std;
namespace data {
const int INF = 2147483647;
const int Inf = 0x3f3f3f3f;
const double PI = 3.1415926535897932384626;
}  // namespace data
namespace mypii {
struct PII {
  int first, second;
  PII() {}
  PII(int f, int s) : first(f), second(s) {}
  inline bool operator<(const PII& x) const {
    if (first != x.first) return first < x.first;
    return second < x.second;
  }
  inline bool operator==(const PII& x) const {
    return first == x.first and second == x.second;
  }
  inline bool operator>(const PII& x) const {
    if (first != x.first) return first > x.first;
    return second > x.second;
  }
  inline bool operator!=(const PII& x) const {
    return first != x.first and second != x.second;
  }
};
}  // namespace mypii
namespace make_data {
ofstream out;
ifstream in;
inline string itos(int x) {
  string rt = "";
  while (x) rt = (char)(x % 10 + '0') + rt, x /= 10;
  return rt;
}
class My_io_s {
 public:
  void openoi(int x) { out.open(("T_" + itos(x) + ".in").c_str()); }
  void openoo(int x) { out.open(("T_" + itos(x) + ".out").c_str()); }
  void openii(int x) { in.open(("T_" + itos(x) + ".in").c_str()); }
  void openio(int x) { in.open(("T_" + itos(x) + ".out").c_str()); }
  void open1(int x) { openoi(x); }
  void open2(int x) {
    openii(x);
    openoo(x);
  }
  void closei() { in.close(); }
  void closeo() { out.close(); }
  void close() {
    closei();
    closeo();
  }
  void oii(int a, int b) { out << a << ' ' << b << endl; }
  void oi_(int x) { out << x << ' '; }
  void oip(int x) { out << x << endl; }
} My;
}  // namespace make_data
namespace runtime {
clock_t __stt;
inline void TStart() { __stt = clock(); }
inline void TReport() {
  printf("\nTaken Time : %.3lf sec\n",
         (double)(clock() - __stt) / CLOCKS_PER_SEC);
}
}  // namespace runtime
namespace quickread {
inline void rdl(long long& val) {
  long long x = 0;
  int f = 1;
  char ch = getchar();
  while ((ch < '0' or ch > '9') and ch != '-') ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (ch >= '0' and ch <= '9') {
    x = (x << 3) + (x << 1) + ch - '0';
    ch = getchar();
  }
  val = x * f;
}
inline void rdi(int& val) {
  int x = 0;
  int f = 1;
  char ch = getchar();
  while ((ch < '0' or ch > '9') and ch != '-') ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (ch >= '0' and ch <= '9') {
    x = (x << 3) + (x << 1) + ch - '0';
    ch = getchar();
  }
  val = x * f;
}
inline long long rdl() {
  long long x = 0;
  int f = 1;
  char ch = getchar();
  while ((ch < '0' or ch > '9') and ch != '-') ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (ch >= '0' and ch <= '9') {
    x = (x << 3) + (x << 1) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline int rdi() {
  int x = 0;
  int f = 1;
  char ch = getchar();
  while ((ch < '0' or ch > '9') and ch != '-') ch = getchar();
  if (ch == '-') {
    f = -1;
    ch = getchar();
  }
  while (ch >= '0' and ch <= '9') {
    x = (x << 3) + (x << 1) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
inline void _write(int x) {
  write(x);
  putchar(' ');
}
inline void print(int x) {
  write(x);
  putchar('\n');
}
inline void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
inline void _write(long long x) {
  write(x);
  putchar(' ');
}
inline void print(long long x) {
  write(x);
  putchar('\n');
}
}  // namespace quickread
namespace dsu {
int par[200200];
inline void init(int _n) {
  for (int i = 0; i < _n; ++i) par[i] = i;
}
inline int find(int now) {
  if (par[now] == now) return now;
  return par[now] = find(par[now]);
}
inline bool unite(int a, int b) {
  int Pa(find(a)), Pb(find(b));
  if (Pa == Pb) return false;
  par[Pa] = Pb;
  return true;
}
}  // namespace dsu
using namespace quickread;
using namespace dsu;
using namespace mypii;
using namespace make_data;
using namespace runtime;
using namespace data;
namespace mcf {
struct Edge {
  int to, cap, rev, cost;
  Edge() {}
  Edge(int to, int cap, int rev, int cost)
      : to(to), cap(cap), rev(rev), cost(cost) {}
};
vector<Edge> egs[1005];
void newedge(int u, int v, int cap, int cost) {
  egs[u].emplace_back(v, cap, egs[v].size(), cost);
  egs[v].emplace_back(u, 0, egs[u].size() - 1, -cost);
}
int dist[1005], h[1005];
int prv[1005], pre[1005];
inline pair<int, int> getans(int s, int t) {
  int flow = 0, cost = 0;
  for (;;) {
    priority_queue<pair<int, int> > pq;
    memset(dist, 0x3f, sizeof(dist));
    dist[s] = 0;
    pq.emplace(0, s);
    for (; pq.size();) {
      pair<int, int> X = pq.top();
      pq.pop();
      int now = X.second;
      if (dist[now] != X.first) continue;
      for (int i = 0; i < egs[now].size(); ++i) {
        Edge& e = egs[now][i];
        if (e.cap && dist[e.to] > dist[now] + e.cost + h[now] - h[e.to]) {
          dist[e.to] = dist[now] + e.cost + h[now] - h[e.to];
          prv[e.to] = now;
          pre[e.to] = i;
          pq.emplace(dist[e.to], e.to);
        }
      }
    }
    if (dist[t] == Inf) return make_pair(flow, cost);
    for (int i = s; i <= t; ++i) h[i] += dist[i];
    int fl = Inf;
    for (int i = t; i != s; i = prv[i]) fl = min(fl, egs[prv[i]][pre[i]].cap);
    flow += fl;
    cost += fl * h[t];
    for (int i = t; i != s; i = prv[i]) {
      Edge& e = egs[prv[i]][pre[i]];
      e.cap -= fl;
      egs[i][e.rev].cap += fl;
    }
  }
}
}  // namespace mcf
using namespace mcf;
namespace Max_Segment_Tree {
const int mAxn = 3e5 + 5;
struct M_Sgt {
  int mx[mAxn << 3], lazy[mAxn << 3];
  inline void modify(int x, int l, int r, int L, int R, int d) {
    if (L <= l and r <= R) {
      mx[x] += d;
      lazy[x] += d;
      return;
    }
    int md = l + r >> 1;
    if (L <= md) modify(x << 1, l, md, L, R, d);
    if (md < R) modify(x << 1 | 1, md + 1, r, L, R, d);
    mx[x] = max(mx[x << 1], mx[x << 1 | 1]) + lazy[x];
  }
  inline void init() {
    memset(lazy, 0, sizeof(lazy));
    memset(mx, -0x3f, sizeof(mx));
  }
};
}  // namespace Max_Segment_Tree
using namespace Max_Segment_Tree;
const int maxn = 1000;
char buffer[maxn], *S, *T;
inline char Get_Char() {
  if (S == T) {
    T = (S = buffer) + fread(buffer, 1, maxn, stdin);
    if (S == T) return EOF;
  }
  return *S++;
}
inline int read() {
  char c;
  int re = 0, f = 0;
  for (c = Get_Char(); c < '0' or c > '9'; c = Get_Char())
    if (c == '-') f = 1;
  for (; c >= '0' and c <= '9';)
    re = (re << 1) + (re << 3) + (c - '0'), c = Get_Char();
  if (f) return -re;
  return re;
}
inline void read(int& x) {
  char c;
  int re = 0, f = 0;
  for (c = Get_Char(); c < '0' or c > '9'; c = Get_Char())
    if (c == '-') f = 1;
  for (; c >= '0' and c <= '9';)
    re = (re << 1) + (re << 3) + (c - '0'), c = Get_Char();
  if (f)
    x = -re;
  else
    x = re;
}
const int mxn = 2e5 + 5;
int n, m, k, p[mxn];
vector<int> g[mxn], g2[mxn];
int ans;
bool hv[mxn];
int dst[mxn];
int s, t;
inline void bfs() {
  queue<int> q;
  q.push(s);
  memset(dst, 63, sizeof(dst));
  dst[s] = 0;
  for (; q.size();) {
    int u = q.front();
    q.pop();
    for (int v : g[u]) {
      if (dst[v] > dst[u] + 1) {
        dst[v] = dst[u] + 1;
        q.push(v);
      }
    }
  }
}
int d2[mxn];
vector<int> so[mxn], tso[mxn];
inline void bfs2() {
  queue<int> q;
  q.push(t);
  memset(d2, 63, sizeof(d2));
  d2[t] = 0;
  for (; q.size();) {
    int u = q.front();
    q.pop();
    for (int v : g2[u]) {
      if (d2[v] > d2[u] + 1) {
        d2[v] = d2[u] + 1;
        q.push(v);
        so[u].push_back(v);
        tso[v].push_back(u);
      }
    }
  }
}
int dp[mxn];
bool used[mxn];
inline void solve() {
  cin >> n >> m;
  for (int i = 1, u, v; i <= m; ++i) {
    cin >> u >> v;
    g[u].push_back(v);
    g2[v].push_back(u);
  }
  cin >> k;
  for (int i = 1; i <= k; ++i) cin >> p[i], hv[p[i]] = 1;
  s = p[1], t = p[k];
  bfs();
  bfs2();
  for (int i = 1; i <= k; ++i) {
    int j = i + 1;
    for (; j <= k and d2[p[j]] == d2[p[j - 1]] - 1; ++j)
      ;
    if (j == k + 1) break;
    i = j - 1;
    ++ans;
  }
  cout << ans << ' ';
  ans = 0;
  for (int i = 1; i < k; ++i) {
    int u = p[i];
    for (int v : g[u]) {
      if (d2[v] == d2[u] - 1 and v != p[i + 1]) {
        ++ans;
        break;
      }
    }
  }
  cout << ans << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int T;
  T = 1;
  for (; T--;) solve();
}
