#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#ifdef _WIN32
#define getchar_unlocked _getchar_nolock
#endif
#define int long long
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define ppb pop_back
#define eb emplace_back
#define g0(a) get<0>(a)
#define g1(a) get<1>(a)
#define g2(a) get<2>(a)
#define g3(a) get<3>(a)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef double db;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef tuple<int, int, int> iii;
typedef tuple<int, int, int, int> iiii;
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

int N, A[205], mem[205][205][205][2][2][2];

bool dp(int n, int a, int b, bool c, bool d, bool e) {
	if (n == 0) return a == b && c && d && e;
	if (mem[n][a][b][c][d][e] != -1) return mem[n][a][b][c][d][e];
	mem[n][a][b][c][d][e] = (dp(n - 1, (a + A[n]) % 200, b, 1, d, 1) || dp(n - 1, a, (b + A[n]) % 200, c, 1, 1) || dp(n - 1, a, b, c, d, e) || dp(n - 1, (a + A[n]) % 200, (b + A[n]) % 200, 1, 1, e));
	return mem[n][a][b][c][d][e];
}

main() {
	memset(mem, -1, sizeof mem);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> A[i];
		A[i] %= 200;
	}
	if (dp(N, 0, 0, 0, 0, 0)) {
		cout << "Yes\n";
		vector<int> fst, snd;
		for (int a = N, b = 0, c = 0, d = 0, e = 0, f = 0; a; ) {
			if (dp(a - 1, (b + A[a]) % 200, c, 1, e, 1)) {
				fst.pb(a);
				b = (b + A[a]) % 200;
				a--;
				d = f = 1;
			} else if (dp(a - 1, b, (c + A[a]) % 200, d, 1, 1)) {
				snd.pb(a);
				c = (c + A[a]) % 200;
				a--;
				e = f = 1;
			} else if (dp(a - 1, b, c, d, e, f)) {
				a--;
			} else {
				assert(dp(a - 1, (b + A[a]) % 200, (c + A[a]) % 200, 1, 1, f));
				snd.pb(a);
				fst.pb(a);
				b = (b + A[a]) % 200;
				c = (c + A[a]) % 200;
				a--;
				d = e = 1;
			}
		}
		sort(fst.begin(), fst.end());
		sort(snd.begin(), snd.end());
		cout << fst.size() << ' ';
		for (int i : fst) cout << i << ' ';
		cout << '\n';
		cout << snd.size() << ' ';
		for (int i : snd) cout << i << ' ';
		cout << '\n';
	} else {
		cout << "No\n";
	}
}

#include<bits/stdc++.h>
#define LL long long
#define ull unsigned long long
#define pii pair<int, int>
#define lson (o << 1)
#define rson (o << 1 | 1)
#define mp make_pair
#define fi first
#define se second
using namespace std;
template <class T> T gi() {
    T x = 0; bool f = 0; char c = getchar();
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    if (c == '-') f = 1, c = getchar();
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return f ? -x : x;
}
const int N = 5010, Mod = 998244353;
void pls(int &x, int y) { x += y; if (x >= Mod) x -= Mod; }
int fpow(int a, int b) {
	int res = 1;
	for (; b; b >>= 1, a = 1ll * a * a % Mod)
		if (b & 1) res = 1ll * res * a % Mod;
	return res;
}
int pw[N];
int main() {
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	int n = gi<int>(), m = gi<int>();
	int ans = 1ll * fpow(m, n) * n % Mod;
	pw[0] = 1; for (int i = 1; i <= n; i++) pw[i] = 1ll * pw[i - 1] * m % Mod;
	for (int j = 1; j <= m; j++)
		for (int i = 0, t = 1; i <= n - 2; i++, t = 1ll * t * (m - j) % Mod) 
			pls(ans, Mod - 1ll * (n - i - 1) * t % Mod * pw[n - i - 2] % Mod);
	printf("%d\n", ans);
	return 0;
}
