#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)
typedef long long ll;

const int mxN = 5e3+5;
const int mxM = 5e3+5;
const int mod = 998244353;

int N, M;
int powtbl[mxM][mxN], powsum[mxN];

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    // observation 1: X will contribute if min(prv[X], pos[X], thing) < X
    // <=> X will not contribute if min(prv[X], pos[x], thing) > X
    //  consider prv[X] = 0 (DNE), 1, 2...pos[X]-1;
    //      (M-X) ** (pos[X]-1-prv[X])
    //
    //      rest: M ** (prv[X]-1)    *    M ** (N - pos[X]);
    //      
    // for each i < j:
    //      for each X:
    //          (M-X) ** (j-1-i)   *   M ** (i-1)   *   M ** (N-j);
    //  -------
    //
    //          (M-X)**(j-1-i) * M**(N-j+i-1)
    //          precompute 0...M ** 0..N
    //          precompute add (0 to M-1) ** 0...N
    cin >> N >> M;

    FOR(i,0,M){
        powtbl[i][0] = 1;
        if (i<M) powsum[0] += powtbl[i][0];
        FOR(j,1,N){
            powtbl[i][j] = (ll)powtbl[i][j-1]*i % mod;
            if (i<M) powsum[j] = (powsum[j]+powtbl[i][j]) % mod;
        }
    }

    int ans = 1;
    FOR(i,1,N) ans = (ll)ans*M % mod;
    ans = (ll)ans*N % mod;

    FOR(i,1,N){
        FOR(j,i+1,N){
            int x = (ll)powsum[j-i-1] * powtbl[M][N-j+i-1] % mod;
            ans = ((ll)ans-x+mod) % mod;
        }
    }
    cout << ans << '\n';
}


// Problem: C - IPFL
// Contest: AtCoder - AtCoder Beginner Contest 199（Sponsored by Panasonic）
// URL: https://atcoder.jp/contests/abc199/tasks/abc199_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
// #define int long long
// #define maxn 
// #define mod 
using namespace std;
// template<class T>T ABS(T x) {return x<0?-x:x;}
//int ksm(int x,int y) {int r=1;while(y) y&1?r=1ll*r*x%mod:0,x=1ll*x*x%mod,y>>=1;return r;}
int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return s*w;
}
char S[2][1000010];int n,Q;
// struct Edge{int to,next;}a[maxn];
// int h[maxn],cnt;
// void add(int x,int y) {a[++cnt]=(Edge){y,h[x]},h[x]=cnt,a[++cnt]=(Edge){x,h[y]},h[y]=cnt;}
signed main()
{
	n=read();
	scanf("%s",S[0]+1);
	for(int i=1;i<=n;i++) S[1][i]=S[0][i+n];
	int fr=0;Q=read();
	for(int i=1;i<=Q;i++)
	{
		if(read()==2) fr^=1,read(),read();
		else {
			int x=read(),y=read();
			swap(S[fr^(x>n)][(x>n?x-n:x)],S[fr^(y>n)][(y>n?y-n:y)]);
		}
	}
	for(int i=1;i<=n;i++) cout<<S[fr][i];
	for(int i=1;i<=n;i++) cout<<S[fr^1][i];
	return 0;
}