rt 应当是一些愚蠢的问题
#include<bits/stdc++.h>
using namespace std;
int t;
int f[200005];
int n,m;
struct Edge{
int u,v;
}edge[400005];
struct node{
int v,nxt;
}e[400005];
int head[200005],cnt;
void add(int u,int v){
cnt++;
e[cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int findx(int x){
if(x==f[x]) return x;
return f[x]=findx(f[x]);
}
int merge(int x,int y){
int a=findx(x);
int b=findx(y);
if(a!=b) f[a]=b;
}
int vis[200005];
int ans[200005];
int siz[200005];
int fa[200005];
int u,v;
void dfs(int u,int ff){
siz[u]=1;fa[u]=ff;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==ff) continue;
dfs(v,u);
siz[u]+=siz[v];
}
}
void getans(int u,int fa){
ans[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==fa) continue;
getans(v,u);
}
}
int main(){
cin>>t;
while(t--){
scanf("%d%d",&n,&m);
cnt=0;
int num=0;
for(int i=1;i<=m;i++){
vis[i]=0;
scanf("%d%d",&edge[i].u,&edge[i].v);
}
for(int i=1;i<=n;i++){
f[i]=i;
ans[i]=0;
siz[i]=0;
head[i]=0;
fa[i]=0;
}
for(int i=1;i<=m;i++){
int u=edge[i].u,v=edge[i].v;
if(findx(u)!=findx(v)){
vis[i]=1;
add(u,v);
add(v,u);
merge(u,v);
num++;
}
}
if(num!=n-1){
cout<<-1<<endl;
continue;
}
dfs(1,0);
bool flag=0;
for(int i=1;i<=m;i++){
if(!vis[i]){
if(siz[edge[i].u]<siz[edge[i].v])getans(edge[i].u,fa[edge[i].u]);
else getans(edge[i].v,fa[edge[i].v]);
flag=1;
break;
}
}
if(!flag){
cout<<-1<<endl;
continue;
}
for(int i=1;i<=n;i++){
if(ans[i]==1) cout<<"W";
else cout<<"B";
}
cout<<endl;
}
}