```go
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n, m int
fmt.Fscan(in, &n, &m)
adj := make([][]int, n+1)
rev := make([][]int, n+1)
for i := 0; i < m; i++ {
var j, k int
fmt.Fscan(in, &j, &k)
adj[j] = append(adj[j], k)
rev[k] = append(rev[k], j)
}
indeg := make([]int, n+1)
for u := 1; u <= n; u++ {
for _, v := range adj[u] {
indeg[v]++
}
}
var q []int
for i := 1; i <= n; i++ {
if indeg[i] == 0 {
q = append(q, i)
}
}
var topo []int
for len(q) > 0 {
u := q[0]
q = q[1:]
topo = append(topo, u)
for _, v := range adj[u] {
indeg[v]--
if indeg[v] == 0 {
q = append(q, v)
}
}
}
if len(topo) < n {
fmt.Fprintln(out, -1)
return
}
minAnc := make([]int, n+1)
for _, v := range topo {
mn := v
for _, u := range rev[v] {
if minAnc[u] < mn {
mn = minAnc[u]
}
}
minAnc[v] = mn
}
minDes := make([]int, n+1)
revTopo := make([]int, len(topo))
copy(revTopo, topo)
for i, j := 0, len(revTopo)-1; i < j; i, j = i+1, j-1 {
revTopo[i], revTopo[j] = revTopo[j], revTopo[i]
}
for _, v := range revTopo {
mn := v
for _, c := range adj[v] {
if minDes[c] < mn {
mn = minDes[c]
}
}
minDes[v] = mn
}
cnt := 0
sb := strings.Builder{}
for i := 1; i <= n; i++ {
if minAnc[i] == i && minDes[i] == i {
cnt++
sb.WriteByte('A')
} else {
sb.WriteByte('E')
}
}
fmt.Fprintln(out, cnt)
fmt.Fprintln(out, sb.String())
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
```