Problem: Please pay attention to the unusual memory limit in this problem.

In a parallel universe, Satan is called "Trygub". For that reason, the letters of his namesake were deleted from the alphabet in ancient times.

The government has n workers standing in a row and numbered with integers from 1 to n from left to right. Their job categories can be represented as a string s of length n, where the character s_i represents the job category of the i-th worker.

A new law will be approved to increase the equality between the workers. The government decided to make everyone have the same job category by performing the following operation any number of times (possibly zero).

There is a fixed rational parameter k=\frac ab describing how easy it is to convince the public, and it will be used to determine the success of an operation.

In an operation, the government first selects a job category x with at least one worker at the current moment. Suppose i_1,…, i_m (i_1<…<i_m) are the positions of all the workers with job category x. If k⋅ (i_m-i_1+1)≤ m, the government is able to choose any job category y with at least one worker at the current moment and change the job category of all workers with job category x to job category y.

If it is possible to make all workers have job category x, we say that x is obtainable. Can you tell the government the set of obtainable job categories?

Input

The first line contains three integers n, a, b (1 ≤ n ≤ 5000, 1≤ a≤ b≤ 10^5) — the number of workers and the numerator and denominator of the parameter k, respectively.

The second line contains a string s of length n, consisting of lowercase English characters — the job categories of each worker. The characters 't', 'r', 'y', 'g', 'u', and 'b' do not appear in the string s.

Output

Print an integer c equal to the number of obtainable job categories followed by c space-separated characters — the obtainable job categories sorted in the lexicographical order.

Example

Input


7 1 2
comicom


Output


3 c m o

Note

The first operation must select the job category 'i' because all other job categories cannot satisfy the condition, therefore 'i' is not obtainable.

Below is showed how to obtain 'c', 'm', and 'o'. The square brackets denote the segment containing all workers of the selected category, the red color denotes this category and the blue color denotes the new category after the change.

  * Get 'c': 
    1. (com\color{red}{[i]}com → com\color{#1E90FF}{[o]}com) 
    2. (c\color{red}{[o}m\color{red}{o}c\color{red}{o]}m → c\color{#1E90FF}{[m}m\color{#1E90FF}{m}c\color{#1E90FF}{m]}m) 
    3. (c\color{red}{[mmm}c\color{red}{mm]} → c\color{#1E90FF}{[ccc}c\color{#1E90FF}{cc]}) 
  * Get 'm': 
    1. (com\color{red}{[i]}com → com\color{#1E90FF}{[o]}com) 
    2. (c\color{red}{[o}m\color{red}{o}c\color{red}{o]}m → c\color{#1E90FF}{[c}m\color{#1E90FF}{c}c\color{#1E90FF}{c]}m) 
    3. (\color{red}{[cc}m\color{red}{ccc]}m → \color{#1E90FF}{[mm}m\color{#1E90FF}{mmm]}m) 
  * Get 'o': 
    1. (com\color{red}{[i]}com → com\color{#1E90FF}{[c]}com) 
    2. (\color{red}{[c}om\color{red}{cc]}om → \color{#1E90FF}{[m}om\color{#1E90FF}{mm]}om) 
    3. (\color{red}{[m}o\color{red}{mmm}o\color{red}{m]} → \color{#1E90FF}{[o}o\color{#1E90FF}{ooo}o\color{#1E90FF}{o]}) 

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
 
using ll = long long;
using ld = long double;
using db = double; 
using str = string; // yay python!

using pi = pair<int,int>;
using pl = pair<ll,ll>;
using pd = pair<db,db>;

using vi = vector<int>;
using vb = vector<bool>;
using vl = vector<ll>;
using vd = vector<db>; 
using vs = vector<str>;
using vpi = vector<pi>;
using vpl = vector<pl>; 
using vpd = vector<pd>;

#define tcT template<class T
#define tcTU tcT, class U
// ^ lol this makes everything look weird but I'll try it
tcT> using V = vector<T>; 
tcT, size_t SZ> using AR = array<T,SZ>; 
tcT> using PR = pair<T,T>;

// pairs
#define mp make_pair
#define f first
#define s second

// vectors
// oops size(x), rbegin(x), rend(x) need C++17
#define sz(x) int((x).size())
#define bg(x) begin(x)
#define all(x) bg(x), end(x)
#define rall(x) x.rbegin(), x.rend() 
#define sor(x) sort(all(x)) 
#define rsz resize
#define ins insert 
#define ft front()
#define bk back()
#define pb push_back
#define eb emplace_back 
#define pf push_front

#define lb lower_bound
#define ub upper_bound 
tcT> int lwb(V<T>& a, const T& b) { return int(lb(all(a),b)-bg(a)); }

// loops
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define trav(a,x) for (auto& a: x)

const int MOD = 1e9+7; // 998244353;
const int MX = 2e5+5;
const ll INF = 1e18; // not too close to LLONG_MAX
const ld PI = acos((ld)-1);
const int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1}; // for every grid problem!!
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count()); 
template<class T> using pqg = priority_queue<T,vector<T>,greater<T>>;

// bitwise ops
// also see https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
constexpr int pct(int x) { return __builtin_popcount(x); } // # of bits set
constexpr int bits(int x) { assert(x >= 0);
	return x == 0 ? 0 : 31-__builtin_clz(x); } // floor(log2(x)) 
constexpr int p2(int x) { return 1<<x; }
constexpr int msk2(int x) { return p2(x)-1; }

ll cdiv(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // divide a by b rounded up
ll fdiv(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // divide a by b rounded down

tcT> bool ckmin(T& a, const T& b) {
	return b < a ? a = b, 1 : 0; } // set a = min(a,b)
tcT> bool ckmax(T& a, const T& b) {
	return a < b ? a = b, 1 : 0; }

tcTU> T fstTrue(T lo, T hi, U f) {
	hi ++; assert(lo <= hi); // assuming f is increasing
	while (lo < hi) { // find first index such that f is true 
		T mid = lo+(hi-lo)/2;
		f(mid) ? hi = mid : lo = mid+1; 
	} 
	return lo;
}
tcTU> T lstTrue(T lo, T hi, U f) {
	lo --; assert(lo <= hi); // assuming f is decreasing
	while (lo < hi) { // find first index such that f is true 
		T mid = lo+(hi-lo+1)/2;
		f(mid) ? lo = mid : hi = mid-1;
	} 
	return lo;
}
tcT> void remDup(vector<T>& v) { // sort and remove duplicates
	sort(all(v)); v.erase(unique(all(v)),end(v)); }
tcTU> void erase(T& t, const U& u) { // don't erase
	auto it = t.find(u); assert(it != end(t));
	t.erase(it); } // element that doesn't exist from (multi)set

// INPUT
#define tcTUU tcT, class ...U
tcT> void re(complex<T>& c);
tcTU> void re(pair<T,U>& p);
tcT> void re(V<T>& v);
tcT, size_t SZ> void re(AR<T,SZ>& a);

tcT> void re(T& x) { cin >> x; }
void re(db& d) { str t; re(t); d = stod(t); }
void re(ld& d) { str t; re(t); d = stold(t); }
tcTUU> void re(T& t, U&... u) { re(t); re(u...); }

tcT> void re(complex<T>& c) { T a,b; re(a,b); c = {a,b}; }
tcTU> void re(pair<T,U>& p) { re(p.f,p.s); }
tcT> void re(V<T>& x) { trav(a,x) re(a); }
tcT, size_t SZ> void re(AR<T,SZ>& x) { trav(a,x) re(a); }
tcT> void rv(int n, V<T>& x) { x.rsz(n); re(x); }

// TO_STRING
#define ts to_string
str ts(char c) { return str(1,c); }
str ts(const char* s) { return (str)s; }
str ts(str s) { return s; }
str ts(bool b) { 
	#ifdef LOCAL
		return b ? "true" : "false"; 
	#else 
		return ts((int)b);
	#endif
}
tcT> str ts(complex<T> c) { 
	stringstream ss; ss << c; return ss.str(); }
str ts(V<bool> v) {
	str res = "{"; F0R(i,sz(v)) res += char('0'+v[i]);
	res += "}"; return res; }
template<size_t SZ> str ts(bitset<SZ> b) {
	str res = ""; F0R(i,SZ) res += char('0'+b[i]);
	return res; }
tcTU> str ts(pair<T,U> p);
tcT> str ts(T v) { // containers with begin(), end()
	#ifdef LOCAL
		bool fst = 1; str res = "{";
		for (const auto& x: v) {
			if (!fst) res += ", ";
			fst = 0; res += ts(x);
		}
		res += "}"; return res;
	#else
		bool fst = 1; str res = "";
		for (const auto& x: v) {
			if (!fst) res += " ";
			fst = 0; res += ts(x);
		}
		return res;

	#endif
}
tcTU> str ts(pair<T,U> p) {
	#ifdef LOCAL
		return "("+ts(p.f)+", "+ts(p.s)+")"; 
	#else
		return ts(p.f)+" "+ts(p.s);
	#endif
}

// OUTPUT
tcT> void pr(T x) { cout << ts(x); }
tcTUU> void pr(const T& t, const U&... u) { 
	pr(t); pr(u...); }
void ps() { pr("\n"); } // print w/ spaces
tcTUU> void ps(const T& t, const U&... u) { 
	pr(t); if (sizeof...(u)) pr(" "); ps(u...); }

// DEBUG
void DBG() { cerr << "]" << endl; }
tcTUU> void DBG(const T& t, const U&... u) {
	cerr << ts(t); if (sizeof...(u)) cerr << ", ";
	DBG(u...); }
#ifdef LOCAL // compile with -DLOCAL, chk -> fake assert
	#define dbg(...) cerr << "Line(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
	#define chk(...) if (!(__VA_ARGS__)) cerr << "Line(" << __LINE__ << ") -> function(" \
		 << __FUNCTION__  << ") -> CHK FAILED: (" << #__VA_ARGS__ << ")" << "\n", exit(0);
#else
	#define dbg(...) 0
	#define chk(...) 0
#endif

void setPrec() { cout << fixed << setprecision(15); }
void unsyncIO() { cin.tie(0)->sync_with_stdio(0); }
// FILE I/O
void setIn(str s) { freopen(s.c_str(),"r",stdin); }
void setOut(str s) { freopen(s.c_str(),"w",stdout); }
void setIO(str s = "") {
	unsyncIO(); setPrec();
	// cin.exceptions(cin.failbit); 
	// throws exception when do smth illegal
	// ex. try to read letter into int
	if (sz(s)) setIn(s+".in"), setOut(s+".out"); // for USACO
}

int N;
ll A,B;
str S;
V<pair<vi,char>> tmp;
map<char,vi> oc;
bitset<1<<20> ok, solved;

// void process(int mask, int st) {
// 	// vi cur;
// 	// F0R(j,sz(tmp)) if (i&(1<<j)) cur.pb(j);
// 	F0R(j,sz(tmp)) if (mask&(1<<j)) {
// 		vi tri;
// 		F0R(k,sz(tmp)) if (mask&(1<<k)) if (j != k) tri.pb(k);
// 		vb dp(sz(tri)+1); dp[0] = 1;
// 		F0R(i,sz(dp)) if (dp[i])  {
// 			int tmp_mask = 0;
// 			FOR(j,i+1,sz(dp)) {
// 				tmp_mask ^= 1<<tri[j-1];
// 				if (ok[tmp_mask]) dp[j] = 1;
// 			}
// 			if (dp[sz(tri)]) break;
// 		}
// 		if (dp[sz(tri)]) {

// 		}
// 	}
// }

int main() {
	setIO(); re(N,A,B);
	re(S);
	F0R(i,N) oc[S[i]].pb(i);
	trav(t,oc) tmp.pb({t.s,t.f});
	sort(all(tmp));
	// dbg(tmp);
	solved[0] = 1;
	FOR(i,1,1<<sz(tmp)) {
		{
			int lo = MOD, hi = -MOD;
			int tot = 0;
			F0R(j,sz(tmp)) if (i&(1<<j)) {
				ckmin(lo,tmp[j].f.ft);
				ckmax(hi,tmp[j].f.bk);
				tot += sz(tmp[j].f);
			}
			int len = hi-lo+1; assert(len >= tot);
			if (A * len <= B * tot) {
				F0R(j,sz(tmp)) if (i&(1<<j)) {
					if (solved[i^(1<<j)]) {
						ok[i] = 1;
					}
				}
			}
		}
		int tmp_mask = 0;
		F0R(j,sz(tmp)) if (i&(1<<j)) {
			tmp_mask ^= 1<<j;
			if (ok[tmp_mask] && solved[i^tmp_mask]) solved[i] = 1;
		}
		// dbg(i,(int)solved[i],(int)ok[i]);
	}
	assert(msk2(sz(tmp)) == ((1<<sz(tmp))-1));
	str sol;
	F0R(i,sz(tmp)) if (solved[msk2(sz(tmp))^(1<<i)]) 
		sol += tmp[i].s;
	pr(sz(sol));
	sor(sol);
	trav(c,sol) pr(' ',c);
	// FOR(i,1,1<<sz(tmp)) {
	// 	if (pct(i) == 1) {
	// 		ok[i] = 1;
	// 		continue;
	// 	}
	// 	for (int j = (i-1)&i; j > 0; j = (j-1)&i) {
	// 		if (valid[j] && ok[j] && ok[i^j])
	// 			valid[i] = 1;
	// 	}
	// }

	// you should actually read the stuff at the bottom
}

/* stuff you should look for
	* int overflow, array bounds
	* special cases (n=1?)
	* do smth instead of nothing and stay organized
	* WRITE STUFF DOWN
	* DON'T GET STUCK ON ONE APPROACH
*/