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

template <typename T>
inline void read(T &f) {
	f = 0; int fu = 0; char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') fu = 1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		f = f * 10 + (c - '0');
		c = getchar();
	}
	if (fu) f = -f;
}

const int md = 998244353;

inline int add(int x, int y) {
	if (x + y >= md) return x + y - md;
	return x + y;
}

inline int sub(int x, int y) {
	if (x < y) return x - y + md;
	return x - y;
}

inline int mul(int x, int y) { return 1ull * x * y % md; }

inline int fpow(int x, int y) {
	int ans = 1;
	while (y) {
		if (y & 1) ans = mul(ans, x);
		y >>= 1; x = mul(x, x);
	}
	return ans;
}

const int N = 4e5 + 5;

vector <int> adj[N];
int fa[N], now[N], cnt[N], ban[N], bans[N], a[N], id[N], inv[N], dep[N];
int T, n, rt, ans, all;

bool cmp(int i, int j) { return a[i] < a[j]; }

void dfs1(int u) {
	for (auto v : adj[u]) {
		if (v == fa[u]) continue;
		dep[v] = dep[u] + 1; fa[v] = u; dfs1(v); ++cnt[u];
	}
}

int dfs2(int u) {
	int sums = 1;
	for (auto v : adj[u]) {
		if (v == fa[u]) continue;
		int coef = (bans[v] ? add(now[u], inv[cnt[u]]) : now[u]);
		int tmp = dfs2(v);
		sums = add(sums, mul(tmp, coef));
	}
//	fprintf(stderr, "u = %d, sums = %d\n", u, sums);
	if (!ban[u]) all = add(all, sums);
	return ban[u] ? 0 : sums;
}

int dp[45][45];

int main() {
	for (int i = 1; i <= 40; i++) {
		for (int j = 0; j <= 40; j++) {
			dp[i][j] = fpow(i + j, md - 2);
			dp[i][j] = add(dp[i][j], mul(dp[i - 1][j], mul(i - 1, fpow(i + j, md - 2))));
		}
	}
	cout << dp[3][2] << endl;
	return 0;
}
