← Home
```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
}
```