

思路 :
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define endl '\n'
#define _(a) cout << #a << ": " << (a) << " "
#define one first
#define two second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
const int N = 2e3 + 10;
int n, m;
string a[N];
vector<int> g[N];
int d[N];
bool st[N];
int fa[N];
bool check(string u, string v) {
int diff = 0;
for (int i = 0; i < m; ++ i) {
diff += (u[i] != v[i]);
}
return (diff <= 1);
}
void dijkstra() {
memset(d, 0x3f, sizeof d);
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push({0, n + 1});
d[n + 1] = 0;
while (pq.size()) {
pii t = pq.top(); pq.pop();
int u = t.two;
if (st[u]) continue;
st[u] = true;
for (int v : g[u]) {
if (d[v] > d[u] + 1) {
fa[v] = u;
d[v] = d[u] + 1;
pq.push({d[v], v});
}
}
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n + 2; ++ i) cin >> a[i];
for (int i = 1; i <= n + 2; ++ i) {
for (int j = i + 1; j <= n + 2; ++ j) {
if (check(a[i], a[j])) {
g[i].pb(j);
g[j].pb(i);
}
}
}
dijkstra();
if (d[n + 2] == 0x3f3f3f3f) cout << -1;
else {
cout << d[n + 2] - 1 << endl;
vector<int> ans;
int now = n + 2;
while (now != n + 1) {
ans.push_back(now);
now = fa[now];
}
ans.push_back(n + 1);
for (int i = (int)ans.size() - 1; i >= 0; -- i) cout << a[ans[i]] << endl;
}
}