// first second push_back unordered return continue break vector visited check flag bool while iterator begin end lower_bound upper_bound temp true false ll_MAX ll_MIN insert erase clear pop push compare ll64_MAX ll64_MIN  reverse replace stringstream string::npos length substr front priority_queue

#ifndef ONLINE_JUDGE
#include "debug.h"

template<class TupType, size_t... I>
void print(const TupType& _tup, index_sequence<I...>)
{
	cout << "(";
	(..., (cout << (I == 0 ? "" : ", ") << get<I>(_tup)));
	cout << ") ";
}

template<class... T>
void print (const tuple<T...>& _tup)
{
	print(_tup, make_index_sequence<sizeof...(T)>());
}

#else
#include <bits/stdc++.h>
using namespace std;
#define debug(...) 42
#endif

#define ll long long
#define minpq priority_queue <int, vector<int>, greater<int> >
using db = long double;
using pll = pair < ll, ll >;
#define all(a)      (a).begin(),(a).end()
#define unique_sort(x) sort(all(x)), x.resize(distance(x.begin(), unique(all(x))))
#define hell 1000000007
#define infl LLONG_MAX
#define cout_p(x, p) cout << fixed << setprecision((p)) << x << endl     //print with precision

#define tup tuple<ll,ll,ll>

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

	ll t, i, x, j, y, z, k, n;
	cin >> n >> k;
	const db eps = 1e-9;

	vector<ll> v(n);
	for (auto &zx : v)	cin >> zx;
	debug(v);

	vector<vector<db>> dp(n, vector<db>(10, -infl));
	vector<vector<tup>> par(n, vector<tup>(10, make_tuple(-1, -1, -1)));

	for (ll i = 0; i < n; i++) {
		ll d = v[i] % 10;
		db x = log(v[i]);
		dp[i][d] = x;
		par[i][d] = make_tuple(i, -1, -1);

		if (i == 0)	continue;

		for (ll pd = 0; pd < 10; pd++) {
			dp[i][pd] = dp[i - 1][pd];
			par[i][pd] = par[i - 1][pd];
		}

		if (dp[i][d] < x) {
			dp[i][d] = x;
			par[i][d] = make_tuple(i, -1, -1);
		}

		for (ll pd = 0; pd < 10; pd++) {
			if (dp[i - 1][pd] < -eps)	continue;
			ll cd = (pd * d) % 10;

			if (dp[i - 1][pd] + x >= dp[i][cd] - eps) {
				dp[i][cd] = dp[i - 1][pd] + x;
				par[i][cd] = make_tuple(i, get<0>(par[i - 1][pd]), pd);
			}
		}
	}

#ifndef ONLINE_JUDGE
	for (ll i = 0; i < n; i++) {
		// for (ll pd = 0; pd < 10; pd++)	print(par[i][pd]);
		// cout << "\n";
	}
#endif
	// debug(par);

	vector<ll> ans, out;
	i = n - 1;

	if (dp[i][k] >= 0) {
		while (i >= 0 and k >= 0) {
			ans.push_back(get<0>(par[i][k]));

			// debug(get<0>(par[i][k]), get<1>(par[i][k]), get<2>(par[i][k]));
			t = get<2>(par[i][k]);
			i = get<1>(par[i][k]);
			k = t;
		}
	} else	{
		return cout << "-1", 0;
	}

	debug(ans);
	for (auto &zx : ans)	out.push_back(v[zx]);

	cout << out.size() << "\n";
	sort(all(out));
	for (auto &zx : out)	cout << zx << " ";
}

