#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
#include <memory.h>
#include <iomanip>
#include <bitset>
#include <list>
#include <stack>
#include <deque>
#include <numeric>

using namespace std;

#define mod 1000000007

// seiyaku[i][0] : 値iは行seiyaku[i][0]で最大値でないといけない
// seiyaku[i][1] : 値iは列seiyaku[i][0]で最大値でないといけない
int seiyaku[1000001][2] = {};

int main()
{
	int n, m;
	cin >> n >> m;
	long long int ans = 1;
	for(int i = 1; i <= n; i++){
		int a;
		cin >> a;
		if(seiyaku[a][0] > 0) ans = 0;
		else seiyaku[a][0] = i;
	}
	for(int i = 1; i <= m; i++){
		int b;
		cin >> b;
		if(seiyaku[b][1] > 0) ans = 0;
		else seiyaku[b][1] = i;
	}
	// i行目にはすでに最大値が埋められている
	bool alreadymax_g[1001];
	// i列目にはすでに最大値が埋められている
	bool alreadymax_r[1001];
	for(int i = 1; i <= n; i++){
		alreadymax_g[i] = false;
	}
	for(int i = 1; i <= m; i++){
		alreadymax_r[i] = false;
	}

	for(int i = n * m; i>= 1; i--){
		int g = seiyaku[i][0];
		int r = seiyaku[i][1];
		if(g > 0 && r > 0){
			// 行と列どちらにも制約がある(最大値となる)場合
			// g行目r列目にiを埋めないといけない
			if(alreadymax_g[g] || alreadymax_r[r]){
				ans = 0;
			} else {
				alreadymax_g[g] = true;
				alreadymax_r[r] = true;
			}
		} else if(g > 0 && r == 0){
			// 行にのみ制約がある場合
			// g行目に埋めることは確定しているが、列は確定していない
			if(alreadymax_g[g]){
				// g行目にすでに最大値が埋まっていたらアウト
				ans = 0;
			} else {
				alreadymax_g[g] = true;
				// g行目で制約を気にせず入れられるマスの数を求める
				int tmp = 0;
				for(int j = 1; j <= m; j++){
					if(alreadymax_r[j]) tmp++;
				}
				ans = (ans * tmp) % mod;
			}
		} else if(g == 0 && r > 0){
			// 列のみに制約がある場合
			// 上と同様
			if(alreadymax_r[r]){
				ans = 0;
			} else {
				alreadymax_r[r] = true;
				int tmp = 0;
				for(int j = 1; j <= n; j++){
					if(alreadymax_g[j]) tmp++;
				}
				ans = (ans * tmp) % mod;
			}
		} else {
			// 行にも列にも制約がない場合
			int tmp_g = 0;
			int tmp_r = 0;
			for(int j = 1; j <= n; j++){
				if(alreadymax_g[j]) tmp_g++;
			}
			for(int j = 1; j <= m; j++){
				if(alreadymax_r[j]) tmp_r++;
			}
			ans =(ans * (tmp_r * tmp_g - (n * m - i))) % mod;
		}
	}
	cout << ans << endl;
}
#include <bits/stdc++.h>
using namespace std;

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n;
    string s;
    cin >> n >> s;
    vector<int> ans;
    for(int i = 0; i < 4; i++){
    	ans.resize(n);
    	ans[0] = i%2;
    	ans[1] = i/2;
    	for(int j = 1; j < n-1; j++){
    		if(s[j] == 'o'){
    			if(ans[j] == 0) ans[j+1] = ans[j-1];
    			else ans[j+1] = !ans[j-1];
    		}
    		else{
    			if(ans[j] == 0) ans[j+1] = !ans[j-1];
    			else ans[j+1] = ans[j-1];
    		}
    	}
    	if(s[0] == 'o'){
    		if((ans[0] == 0) ^ (ans[1] == ans.back())) continue;
    	}
    	else{
    		if((ans[0] == 0) ^ (ans[1] != ans.back())) continue;
    	}
    	if(s.back() == 'o'){
    		if((ans.back() == 0) ^ (ans[0] == ans[n-2])) continue;
    	}
    	else{
    		if((ans.back() == 0) ^ (ans[0] != ans[n-2])) continue;
    	}
    	for(int j = 0; j < n; j++){
    		cout << "SW"[ans[j]];
    	}
    	cout << endl;
    	return 0;
    }
    cout << -1 << endl;
    return 0;
}