#include <bits/stdc++.h>
using namespace std;
const int EPS = 1e-9;
const int INF = 1e14;
int cost[502][502], lx[502], ly[502], slack[502];
int n, max_match, xy[502], yx[502], slackx[502], prev2[502];
bool S[502], T[502];
void add_to_tree(int x, int prevx) {
  S[x] = true, prev2[x] = prevx;
  for (int y = 0; y < int(n); y++)
    if (lx[x] + ly[y] - cost[x][y] < slack[y] - EPS)
      slack[y] = lx[x] + ly[y] - cost[x][y], slackx[y] = x;
}
void update_labels() {
  int delta = INF;
  for (int y = 0; y < int(n); y++)
    if (!T[y]) delta = min(delta, slack[y]);
  for (int x = 0; x < int(n); x++)
    if (S[x]) lx[x] -= delta;
  for (int y = 0; y < int(n); y++)
    if (T[y])
      ly[y] += delta;
    else
      slack[y] -= delta;
}
void init_labels() {
  memset(lx, 0, sizeof(lx)), memset(ly, 0, sizeof(ly));
  for (int x = 0; x < int(n); x++)
    for (int y = 0; y < int(n); y++) lx[x] = max(lx[x], cost[x][y]);
}
void augment() {
  if (max_match == n) return;
  int x, y, root, q[502], wr = 0, rd = 0;
  memset(S, false, sizeof(S)), memset(T, false, sizeof(T));
  memset(prev2, -1, sizeof(prev2));
  for (int x = 0; x < int(n); x++)
    if (xy[x] == -1) {
      q[wr++] = root = x, prev2[x] = -2;
      S[x] = true;
      break;
    }
  for (int y = 0; y < int(n); y++)
    slack[y] = lx[root] + ly[y] - cost[root][y], slackx[y] = root;
  while (true) {
    while (rd < wr) {
      x = q[rd++];
      for (y = 0; y < n; y++)
        if (cost[x][y] == lx[x] + ly[y] && !T[y]) {
          if (yx[y] == -1) break;
          T[y] = true;
          q[wr++] = yx[y], add_to_tree(yx[y], x);
        }
      if (y < n) break;
    }
    if (y < n) break;
    update_labels(), wr = rd = 0;
    for (y = 0; y < n; y++)
      if (!T[y] && slack[y] == 0) {
        if (yx[y] == -1) {
          x = slackx[y];
          break;
        } else {
          T[y] = true;
          if (!S[yx[y]]) q[wr++] = yx[y], add_to_tree(yx[y], slackx[y]);
        }
      }
    if (y < n) break;
  }
  if (y < n) {
    max_match++;
    for (int cx = x, cy = y, ty; cx != -2; cx = prev2[cx], cy = ty)
      ty = xy[cx], yx[cy] = cx, xy[cx] = cy;
    augment();
  }
}
int hungarian() {
  int ret = 0;
  max_match = 0, memset(xy, -1, sizeof(xy));
  memset(yx, -1, sizeof(yx)), init_labels(), augment();
  for (int x = 0; x < int(n); x++) ret += cost[x][xy[x]];
  return ret;
}
char dic[100];
int inv[1000];
void init() {
  int cnt = 0;
  for (char c = 'a'; c <= 'z'; c++) {
    inv[c] = cnt;
    dic[cnt++] = c;
  }
  for (char c = 'A'; c <= 'Z'; c++) {
    inv[c] = cnt;
    dic[cnt++] = c;
  }
}
char A[2002000], B[2002000];
int main() {
  init();
  int len;
  scanf("%d %d", &len, &n);
  scanf("%s", A);
  scanf("%s", B);
  for (int i = 0; i < int(len); i++) cost[inv[A[i]]][inv[B[i]]]++;
  printf("%d\n", hungarian());
  for (int i = 0; i < int(n); i++) printf("%c", dic[xy[i]]);
  printf("\n");
}
