package main
import (
"bufio"
"fmt"
"os"
)
type FastScanner struct {
r *bufio.Reader
}
func NewFastScanner() *FastScanner {
return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}
func (fs *FastScanner) NextInt() int {
sign, val := 1, 0
c, _ := fs.r.ReadByte()
for (c < '0' || c > '9') && c != '-' {
c, _ = fs.r.ReadByte()
}
if c == '-' {
sign = -1
c, _ = fs.r.ReadByte()
}
for c >= '0' && c <= '9' {
val = val*10 + int(c-'0')
c2, err := fs.r.ReadByte()
if err != nil {
break
}
c = c2
if c < '0' || c > '9' {
break
}
}
return sign * val
}
func main() {
fs := NewFastScanner()
n := fs.NextInt()
m := fs.NextInt()
adj := make([][]int, n+1)
radj := make([][]int, n+1)
for i := 0; i < m; i++ {
u := fs.NextInt()
v := fs.NextInt()
adj[u] = append(adj[u], v)
radj[v] = append(radj[v], u)
}
k := fs.NextInt()
p := make([]int, k)
for i := 0; i < k; i++ {
p[i] = fs.NextInt()
}
dist := make([]int, n+1)
for i := 1; i <= n; i++ {
dist[i] = -1
}
t := p[k-1]
queue := make([]int, 0, n)
queue = append(queue, t)
dist[t] = 0
for head := 0; head < len(queue); head++ {
v := queue[head]
for _, u := range radj[v] {
if dist[u] == -1 {
dist[u] = dist[v] + 1
queue = append(queue, u)
}
}
}
minRebuilds, maxRebuilds := 0, 0
for i := 0; i < k-1; i++ {
cur := p[i]
next := p[i+1]
if dist[cur] != dist[next]+1 {
minRebuilds++
maxRebuilds++
} else {
cnt := 0
for _, to := range adj[cur] {
if dist[to] == dist[cur]-1 {
cnt++
}
}
if cnt > 1 {
maxRebuilds++
}
}
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
fmt.Fprintf(out, "%d %d\n", minRebuilds, maxRebuilds)
out.Flush()
}