#include <bits/stdc++.h>
using namespace std;
const int ND = 10000, ED = 10000;
int eg_no, st, en, rs, fl, mx;
int to[ED], nx[ED], cap[ED], cst[ED], last[ND], ds[ND], pr[ND], pr_i[ND];
void init() {
  eg_no = 0;
  memset(last, -1, sizeof(last));
}
void add_edge(int u, int v, int cp, int r_cp, int cs, int r_cs) {
  to[eg_no] = v;
  cap[eg_no] = cp;
  cst[eg_no] = cs;
  nx[eg_no] = last[u];
  last[u] = eg_no++;
  to[eg_no] = u;
  cap[eg_no] = r_cp;
  cst[eg_no] = r_cs;
  nx[eg_no] = last[v];
  last[v] = eg_no++;
}
int bellman() {
  for (int i = 0; i < ND; i++) ds[i] = 1000000000;
  memset(pr, -1, sizeof(pr));
  memset(pr_i, -1, sizeof(pr_i));
  queue<int> q;
  int mrk[ND];
  memset(mrk, 0, sizeof(mrk));
  q.push(st);
  mrk[st] = 1;
  ds[st] = 0;
  while (!q.empty()) {
    int p = q.front();
    q.pop();
    mrk[p] = 0;
    for (int i = last[p]; i >= 0; i = nx[i]) {
      int t = to[i];
      if (cap[i] <= 0) continue;
      if (ds[t] > ds[p] + cst[i]) {
        ds[t] = ds[p] + cst[i];
        pr[t] = p;
        pr_i[t] = i;
        if (mrk[t] == 0) {
          mrk[t] = 1;
          q.push(t);
        }
      }
    }
  }
  if (ds[en] == 1000000000) return 0;
  int x = en, mn = 10000;
  while (pr[x] != -1) {
    mn = min(mn, cap[pr_i[x]]);
    x = pr[x];
  }
  x = en;
  while (pr[x] != -1) {
    int z = pr_i[x];
    cap[z] -= mn;
    cap[z ^ 1] += mn;
    x = pr[x];
  }
  rs += ds[en];
  return mn;
}
int maxflow() {
  rs = 0;
  int ans = 0;
  while (1) {
    int res = bellman();
    if (res == 0) break;
    ans += res;
  }
  return rs;
}
string s1, s2;
int getASCII(char ch) {
  if (ch >= 'A' && ch <= 'Z')
    return int(ch - 'A' + 26);
  else
    return int(ch - 'a');
}
char getCHAR(int x) {
  if (x < 26)
    return char(x + 'a');
  else
    return char(x + 'A' - 26);
}
int main() {
  int n, k;
  cin >> n >> k;
  cin >> s1 >> s2;
  int a[k][k];
  memset(a, 0, sizeof(a));
  for (int i = (0); i < (n); i++) a[getASCII(s1[i])][getASCII(s2[i])] += 1;
  init();
  for (int i = (0); i < (k); i++)
    for (int j = (0); j < (k); j++) {
      add_edge(2 + i, 2 + k + j, 1, 0, -a[i][j], a[i][j]);
    }
  int val = eg_no;
  st = 1, en = 2 + k + k;
  for (int i = (0); i < (k); i++) add_edge(st, 2 + i, 1, 0, 0, 0);
  for (int i = (0); i < (k); i++) add_edge(2 + k + i, en, 1, 0, 0, 0);
  cout << 0 - maxflow() << "\n";
  for (int i = 0; i < val; i += 2)
    if (cap[i] == 0) printf("%c", getCHAR(to[i] - k - 2));
  return 0;
}
