RT。
#include<bits/stdc++.h>
#define PII pair<int,int>
#define P16 pair<i16,i16>
#define F first
#define S second
#define i16 unsigned short
using namespace std;
typedef long long LL;
const int N=505, M=513;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int T;
int n,m;
int a[N];
i16 xsum[N];
bool dp[N][N];
vector<int> G[N*N], usd[N];
P16 pk1[N][M], pk3[N][M];
i16 rlen[N][N];
int getid(int i,int j){return (i-1)*n+j-1;}
i16 pos[N];
i16 Qxor(const i16 &l,const i16 &r){return xsum[r]^xsum[l-1];}
P16 Revid(int x){return {x/n+1,x%n+1};}
vector<pair<i16,P16 > > Ans;
void dfs(int x){
int L,R;
tie(L,R)=Revid(x);
if(L==R) return;
for(auto y:G[x]) dfs(y);
Ans.push_back({pos[Revid(G[x][0]).F],{pos[Revid(G[x][1]).F],pos[Revid(G[x][2]).F]}});
for(int i=R+1;i<=n;i++) pos[i]-=rlen[L][R];
}
void Clear(){
for(i16 i=1;i<=n;i++) usd[i].clear();
for(i16 i=1;i<=n;i++)
for(i16 j=i;j<=n;j++)
dp[i][j]=0, G[getid(i,j)].clear();
for(i16 i=1;i<=n;i++)
for(i16 v=0;v<=m;v++)
pk1[i][v]={n+1,0},
pk3[i][v]={n+1,0};
}
void ckmin(P16 &x,const P16 &y){ if(y.F < x.F) x=y;}
//void Giv(i16 i,i16 j,const int &a,const int &b,const int &c,const int &d){
// G[getid(i,j)].emplace_back(getid(i,a));
// G[getid(i,j)].emplace_back(getid(b,c));
// G[getid(i,j)].emplace_back(getid(d,j));
// rlen[i][j]=b-a-1 + d-c-1 + 2;
// dp[i][j]=1;
// usd[j].emplace_back(i);
//}
void Trans(i16 i,i16 j){
auto Giv = [&](const i16 &a,const i16 &b,const i16 &c,const i16 &d) {
G[getid(i,j)].emplace_back(getid(i,a));
G[getid(i,j)].emplace_back(getid(b,c));
G[getid(i,j)].emplace_back(getid(d,j));
rlen[i][j] = b - a - 1 + d - c - 1 + 2;
dp[i][j] = true;
usd[j].emplace_back(i);
};
for(auto d:usd[j]){
if(d>=i && dp[d][j] && pk3[i][Qxor(d,j)].F < d){
int a=pk3[i][Qxor(d,j)].S;
int b,c;
tie(c,b)=pk1[a+1][Qxor(i,a)^Qxor(d,j)];
Giv(a,b,c,d);
return;
}
}
}
void update(){
for(i16 st=n;st>=1;st--){
for(i16 len=1;st+len-1<=n;len++){
i16 ed=st+len-1;
Trans(st,ed);
if(dp[st][ed]){
i16 val=Qxor(st,ed);
ckmin(pk1[st][val],{ed,st});
for(i16 i=st;i>=1;i--)
ckmin(pk1[i][val],{ed,st});
if(ed<n){
for(i16 v=0;v<=m;v++)
ckmin(pk3[st][val^v],{pk1[ed+1][v].F,ed});
}
}
}
}
}
void Solve(){
n=read();
m=0;
for(i16 i=1;i<=n;i++){
a[i]=read();
xsum[i]=xsum[i-1]^a[i];
m=max(m,a[i]);
}
m=1<<(__lg(m)+1);
Clear();
for(i16 i=1;i<=n;i++)
dp[i][i]=1,usd[i].emplace_back(i);
update();
if(!dp[1][n]){
printf("Shuiniao\n");
return;
}
printf("Huoyu\n");
for(i16 i=1;i<=n;i++) pos[i]=i;
Ans.clear();
dfs(getid(1,n));
printf("%d\n",(int)Ans.size());
for(auto i:Ans)
printf("%d %d %d\n",i.F,i.S.F,i.S.S);
}
int main(){
// freopen("P9746_18.in","r",stdin);
// freopen("qwq.out","w",stdout);
T=read();
while(T--){
Solve();
}
return 0;
}