#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define tiii tuple<int,int,int>
#define tlll tuple<ll,ll,ll>
#define matrix vector<vector<int>>
#define el "\n"
#define pro "chemistry"
#define pb push_back
#define ins insert
#define ii make_pair
#define iii make_tuple
#define fi first
#define se second
#define PI (ld)(acos(-1.0))
#define OO (ll)(1e18+7)
#define oo (int)(5e3+7)
#define mmax (int)(2e5+5)
#define nmax (int)(1e6+7)
#define mod (ll)(1e9+7)
void inline Nhap(ll &x){
char c=getchar();
ll sign=1;
x=0;
while(c<'0'||c>'9'){
if(c=='-') sign*=-1;
c=getchar();
}
x=c-'0';
c=getchar();
while('0'<=c&&c<='9'){
x=x*10+(c-'0');
c=getchar();
}
x*=sign;
}
void inline Xuat(ll x){
if(x<10){
putchar('0'+x);
return;
}
Xuat(x/10);
putchar('0'+x%10);
}
static bitset<1024> dp[205][1024];
static bitset<1024> mask_zero[10],mask_one[10];
inline bitset<1024> xor_permute(bitset<1024> bs,int v){
for(int k=0;k<10;k++){
if(((v>>k)&1)==0) continue;
bitset<1024> z=bs&mask_zero[k];
bitset<1024> o=bs&mask_one[k];
z<<=(1<<k);
o>>=(1<<k);
bs=(z|o);
}
return bs;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
if(fopen(pro".inp","r")){
freopen(pro".inp","r",stdin);
freopen(pro".out","w",stdout);
}
for(int k=0;k<10;k++){
for(int i=0;i<1024;i++){
if(((i>>k)&1)==0) mask_zero[k].set(i);
else mask_one[k].set(i);
}
}
int t_subtask;
while(true){
if(!(cin>>t_subtask)) return 0;
if(t_subtask==0) break;
for(int _=0;_<7;_++){
int n;cin>>n;
if(n==0) break;
vector<int> vs(n);
for(int i=0;i<n;i++) cin>>vs[i];
for(int a=0;a<1024;a++) dp[0][a].reset();
dp[0][0].set(0);
for(int i=1;i<=n;i++){
int v=vs[i-1];
for(int a=0;a<1024;a++) dp[i][a].reset();
for(int a_val=0;a_val<1024;a_val++){
const bitset<1024> &bits=dp[i-1][a_val];
if(bits.none()) continue;
dp[i][a_val]|=bits;
int a1=a_val^v;
dp[i][a1]|=bits;
bitset<1024> perm=xor_permute(bits,v);
dp[i][a_val]|=perm;
}
}
int S_all=0;
for(int x:vs) S_all^=x;
static bitset<1024> best_dp[1024];
for(int a=0;a<1024;a++) best_dp[a]=dp[n][a];
int bestA=0,bestB=0;
long long bestSum;
while(true){
bestSum=-1;
bestA=bestB=0;
for(int a=0;a<1024;a++){
const bitset<1024> &bs=best_dp[a];
if(bs.none()) continue;
for(int b=0;b<1024;b++){
if(!bs.test(b)) continue;
int c=S_all^a^b;
long long s=(long long)a+b+c;
if(s>bestSum){
bestSum=s;
bestA=a;
bestB=b;
}
}
}
vector<int> assign(n,0);
int A=bestA,B=bestB;
for(int i=n;i>=1;i--){
int v=vs[i-1];
if(dp[i-1][A].test(B)){
assign[i-1]=3;
continue;
}
int A1=A^v;
if(dp[i-1][A1].test(B)){
assign[i-1]=1;
A=A1;
continue;
}
int B1=B^v;
assign[i-1]=2;
B=B1;
}
int cnt1=0,cnt2=0,cnt3=0;
for(int x:assign){
if(x==1) cnt1++;
else if(x==2) cnt2++;
else cnt3++;
}
if(cnt1>0&&cnt2>0&&cnt3>0){
string res;
res.reserve(n);
for(int x:assign){
if(x==1) res.push_back('P');
else if(x==2) res.push_back('V');
else res.push_back('H');
}
cout<<res<<el;
break;
}
best_dp[bestA].reset(bestB);
}
}
}
return 0;
}