#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v, cap, cost, next;
};
edge e[100000];
int s, t;
int cnt, nn, m, sumflow;
int head[10100], dis[10100], pre[10100];
bool vis[10100];
void insert(int u, int v, int cap, int cost) {
  e[cnt].u = u;
  e[cnt].v = v;
  e[cnt].cap = cap;
  e[cnt].cost = cost;
  e[cnt].next = head[u];
  head[u] = cnt++;
  e[cnt].u = v;
  e[cnt].v = u;
  e[cnt].cap = 0;
  e[cnt].cost = -cost;
  e[cnt].next = head[v];
  head[v] = cnt++;
}
bool spfa() {
  int i, u, v;
  int que[10100 * 2], front = 1, rear = 0;
  memset(vis, false, sizeof(vis));
  memset(pre, -1, sizeof(pre));
  for (i = 0; i <= nn + 1; i++) {
    dis[i] = (1 << 30);
  }
  vis[s] = true;
  dis[s] = 0;
  que[++rear] = s;
  while (front <= rear) {
    u = que[front++];
    vis[u] = false;
    for (i = head[u]; i != -1; i = e[i].next) {
      v = e[i].v;
      if (e[i].cap && dis[v] > dis[u] + e[i].cost) {
        dis[v] = dis[u] + e[i].cost;
        pre[v] = i;
        if (!vis[v]) {
          que[++rear] = v;
          vis[v] = true;
        }
      }
    }
  }
  if (dis[t] == (1 << 30)) return false;
  return true;
}
int MCMF() {
  int flow = 0;
  int i, minflow, mincost;
  mincost = 0;
  while (spfa()) {
    minflow = (1 << 30);
    for (i = pre[t]; i != -1; i = pre[e[i].u]) {
      if (e[i].cap < minflow) minflow = e[i].cap;
    }
    flow += minflow;
    for (i = pre[t]; i != -1; i = pre[e[i].u]) {
      e[i].cap -= minflow;
      e[i ^ 1].cap += minflow;
    }
    mincost += dis[t] * minflow;
  }
  sumflow = flow;
  return mincost;
}
char s1[2000005], s2[2000005];
int getnum(char c) {
  if (c >= 'a' && c <= 'z') return c - 'a' + 1;
  return c - 'A' + 27;
}
char getc(int x) {
  if (x >= 0 && x < 26) return x + 'a';
  return x - 26 + 'A';
}
int res[60];
int w[60][60];
int main() {
  int u, n, v, c;
  int i, j, k;
  scanf("%d%d", &n, &k);
  scanf("%s%s", s1, s2);
  for (int i = 0; i < n; i++) {
    int p = getnum(s1[i]), q = getnum(s2[i]);
    w[p][q]++;
  }
  s = 0;
  t = 2 * k + 1;
  nn = 2 * k;
  cnt = 0;
  memset(head, -1, sizeof(head));
  for (i = 1; i <= k; i++) {
    for (j = 1; j <= k; j++) {
      insert(i, j + k, 1, -w[i][j]);
    }
  }
  for (i = 1; i <= k; i++) {
    insert(0, i, 1, 0);
    insert(i + k, t, 1, 0);
  }
  int ans = MCMF();
  printf("%d\n", -ans);
  for (i = 0; i < cnt; i++) {
    if (e[i].cap == 0) {
      res[e[i].u] = e[i].v - k;
    }
  }
  for (i = 1; i <= k; i++) {
    printf("%c", getc(res[i] - 1));
  }
  return 0;
}
