RT。思路就是 Tarjan 求割点 + 判断度为 1 点
但是 WA 15pts,基环树全 WA/fad
#include "bits/stdc++.h"
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define ull unsigned long long
#define OPEN freopen ("t3.in", "r", stdin); freopen ("t3.out", "w", stdout);
#define DATA freopen ("t3.in", "w", stdout);
#define pc __builtin_popcount
#define db double
#define pii pair<int, int>
#define fi first
#define se second
#define F(i,x,y) for (int i = (x); i <= (y); ++i)
#define D(i,x,y) for (int i = (x); i >= (y); --i)
using namespace std;
const int inf = 0x7fffffff;
// const ll mod = 998244353ll;
const ll mod = 1ll * 1e9 + 7ll;
namespace FastIO {
inline void Rd(int& x) {
int f = 1;
x = 0;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c - 48), c = getchar();
x *= f;
}
inline void Wt(int x) {
if (x < 10) {
putchar(x + 48);
return;
}
Wt(x / 10);
putchar((x % 10) + 48);
}
}
namespace Maths {
ll fac[560000];
void init() {
fac[0] = 1ll;
F(i, 1, 500000) fac[i] = fac[i - 1] * i % mod;
}
ll qpow(ll x, ll y) {
if (y == 0ll) return 1ll;
ll w = qpow(x, y / 2ll);
if (y % 2ll) return (w * w % mod) * x % mod;
else return w * w % mod;
}
ll qpow(ll x, ll y, ll p) {
if (y == 0ll) return 1ll;
ll w = qpow(x, y / 2ll, p);
if (y % 2ll) return (w * w % p) * x % p;
else return w * w % p;
}
inline ll C(ll x, ll y) {
return (fac[x] * qpow(fac[y], mod - 2ll) % mod) * qpow(fac[x - y], mod - 2ll) % mod;
}
inline ll div(ll x) {
return qpow(x, mod - 2ll);
}
}
struct Edge {
int to, nxt, tree;
}e[680000];
int hd[680000], cnt, ct, n, m;
int d[680000];
int dfn[680000], low[680000], _dfn, ans[680000];
void addedge(int u, int v) {
++ cnt;
e[cnt].to = v;
e[cnt].nxt = hd[u];
e[cnt].tree = 0;
hd[u] = cnt ;
}
void tarjan(int now) {
dfn[now] = low[now] = ++ _dfn;
for (int i = hd[now]; i; i = e[i].nxt) {
int v = e[i].to;
if (dfn[v]) {
low[now] = min(low[now], dfn[v]);
} else {
e[i].tree = 1;
tarjan(v);
low[now] = min(low[now], low[v]);
}
}
}
int mp[310000];
void Main() {
cin >> n >> m;
F(i, 1, n) mp[i] = 0;
F(i, 1, n) dfn[i] = low[i] = 0;
_dfn = 0;
F(i, 1, n) hd[i] = 0; cnt = ct = 0;
F(i, 1, n) d[i] = 0;
F(i ,1, m) {
int u, v;
cin >> u >> v;
// cerr<<u<<' '<<v<<'\n';
addedge(u, v);
addedge(v, u);
++ d[u], ++ d[v];
}
F(i, 1, n) {
int flg = 0;
if (! dfn[i]) flg = 1, tarjan(i);
if (flg) {
// cerr<<i<<'\n';
if (i != 1) {
cout << "-1\n"; return ;
}
int tot = 0;
for (int j = hd[i]; j; j = e[j].nxt) {
if (e[j].tree == 1) ++ tot;
}
if (tot > 1) ans[++ ct] = i;
} else {
for (int j = hd[i]; j; j = e[j].nxt) {
if (e[j].tree == 1 && low[e[j].to] >= dfn[i]) {
ans[++ ct] = i;
break;
}
}
}
}
F(i, 1, ct) mp[ans[i]] = 1;
// F(i,1,n)cerr<<mp[i]<<' ';cerr<<'\n';
int flg = 0;
F(i, 1, n) {
if (! mp[i] && d[i] != 1) flg = i;
}
if (flg == 0) {
cout << "-1\n";
return ;
}
F(i, 1, n) {
if (i == flg) cout << "B";
else cout << "W";
}
cout << "\n";
}
int main() {
IOS
int T; cin >> T; while (T --) Main();
}