#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
vector<int> G[maxn],scc[maxn],nG[maxn];
int dfn[maxn],low[maxn],c[maxn],color[maxn],ncolor[maxn],in[maxn],topo[maxn];
int cnt,num;
stack<int> s;
bool ins[maxn],vis[maxn];
void tarjan(int x){
s.push(x);ins[x]=1;
dfn[x]=low[x]=++num;
for(auto u:G[x]){
if(!dfn[u]){
tarjan(u);
low[x]=min(low[x],low[u]);
}else if(ins[u]){
low[x]=min(low[x],dfn[u]);
}
}
if(dfn[x]==low[x]){
++cnt;
int a;
do{
a=s.top();
c[a]=cnt;
scc[cnt].push_back(a);
s.pop();ins[a]=0;
}while(a!=x);
}
}
bool bob(){
if(cnt==2){
for(int i=1;i<=cnt;i++){
if(ncolor[i]&&nG[i].size()&&!ncolor[nG[i][0]]) return true;
}
if(!in[1]&&!in[2]&&ncolor[1]&&ncolor[2]) return true;
}
bool ok=true;
for(int i=1;i<=cnt;i++){
if(ncolor[i]){
ok=false;
}
}
if(ok){
return true;
}
return false;
}
int toposort(){
int tot=0;
queue<int> q;
for(int i=1;i<=cnt;i++){
if (in[i]==0) q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
topo[tot++]=u;
for(auto v:nG[u]){
if(--in[v]==0){
q.push(v);
}
}
}
return tot;
}
bool dfs(int x){
if(!ncolor[x]){
return false;
}
vis[x]=true;
for(auto u:nG[x]){
bool can=dfs(u);
if(!can){
return false;
}
}
return true;
}
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(color,0,sizeof(color));
memset(ins,false,sizeof(ins));
memset(vis,false,sizeof(vis));
memset(in,0,sizeof(in));
memset(ncolor,0,sizeof(ncolor));
memset(c,0,sizeof(c));
memset(topo,0,sizeof(topo));
for(int i=1;i<=n;i++) G[i].clear(),nG[i].clear(),scc[i].clear();
cnt=num=0;
while(!s.empty()) s.pop();
for(int i=1;i<=n;i++){
cin>>color[i];
}
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
G[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
bool ok=true;
for(int i=1;i<=cnt;i++){
int c=color[scc[i][0]];
ncolor[i]=c;
if(ok){
for(auto u:scc[i]){
if(color[u]!=c){
cout<<"N";
ok=false;
break;
}
}
}
else{
continue;
}
}
for(int i=1;i<=n;i++){
for(auto u:G[i]){
if(c[i]!=c[u]){
in[c[u]]++;
nG[c[i]].push_back(c[u]);
}
}
}
bool bc=bob();
if(bc){
cout<<"B";
continue;
}
int num=toposort();
bool ac;
for(int i=1;i<=n;i++){
if(ncolor[topo[i]]){
ac=dfs(i);
if(ac){
for(int i=1;i<=cnt;i++){
if(!vis[i]&&ncolor[i]){
ac=false;
}
}
}
break;
}
}
if(ac){
cout<<"A";
continue;
}
if(ok){
cout<<"N";
continue;
}
}
return 0;
}