#include <bits/stdc++.h>
using namespace std;
const long long INF = 1 << 28;
const long long LINF = 1ll << 61;
inline long long getnum() {
  register long long r = 0;
  register bool ng = 0;
  register char c;
  c = getchar();
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  if (c == '-') ng = 1, c = getchar();
  while (c != ' ' && c != '\n') r = r * 10 + c - '0', c = getchar();
  if (ng) r = -r;
  return r;
}
template <class T>
inline void putnum(T x) {
  if (x < 0) putchar('-'), x = -x;
  register short a[20] = {}, sz = 0;
  while (x > 0) a[sz++] = x % 10, x /= 10;
  if (sz == 0) putchar('0');
  for (int i = sz - 1; i >= 0; i--) putchar('0' + a[i]);
}
inline void putsp() { putchar(' '); }
inline void putendl() { putchar('\n'); }
inline char mygetchar() {
  register char c = getchar();
  while (c == ' ' || c == '\n') c = getchar();
  return c;
}
struct KM {
  int n, w[55][55];
  int mkx[55], mky[55], mx[55], my[55], lx[55], ly[55], slk[55], pre[55];
  int que[55], qb, qe;
  void init(int sz) {
    n = sz;
    memset(w, 0, sizeof(w));
  }
  int add(int x, int y) { w[x][y]++; }
  void findroute(int y) {
    int x, z;
    while (y != -1) {
      x = pre[y];
      z = mx[x];
      mx[x] = y;
      my[y] = x;
      y = z;
    }
  }
  void find(int X) {
    memset(slk, 127, sizeof(slk));
    int oo = slk[0];
    qb = qe = 0;
    que[qe++] = X;
    mkx[X] = X;
    while (true) {
      for (; qb < qe; qb++) {
        int x = que[qb];
        for (int y = 1; y <= n; y++) {
          if (mky[y] != X) {
            if (lx[x] + ly[y] - w[x][y] < slk[y]) {
              slk[y] = lx[x] + ly[y] - w[x][y];
              pre[y] = x;
            } else if (lx[x] + ly[y] == w[x][y]) {
              pre[y] = x;
              if (my[y] == -1) {
                findroute(y);
                return;
              }
              mkx[my[y]] = mky[y] = X, que[qe++] = my[y];
            }
          }
        }
      }
      int d = oo;
      for (int i = 1; i <= n; i++)
        if (mky[i] != X) d = min(d, slk[i]);
      for (int i = 1; i <= n; i++) {
        if (mkx[i] == X) lx[i] -= d;
        if (mky[i] == X)
          ly[i] += d;
        else if (slk[i] != oo)
          slk[i] -= d;
      }
      for (int y = 1; y <= n; y++) {
        if (mky[y] != X && slk[y] == 0) {
          if (my[y] == -1) {
            findroute(y);
            return;
          }
          mkx[my[y]] = mky[y] = X, que[qe++] = my[y];
        }
      }
    }
  }
  int solve() {
    memset(mx, -1, sizeof(mx));
    memset(my, -1, sizeof(my));
    for (int i = 1; i <= n; i++) lx[i] = *max_element(w[i] + 1, w[i] + n + 1);
    for (int i = 1; i <= n; i++) find(i);
    int ans = 0;
    for (int i = 1; i <= n; i++) ans += w[i][mx[i]];
    return ans;
  }
} km;
int n, tt;
int id[256];
char ch[256], s[2000111], t[2000111];
int main() {
  for (int i = 'a'; i <= 'z'; i++) id[i] = i - 'a' + 1, ch[i - 'a' + 1] = i;
  for (int i = 'A'; i <= 'Z'; i++)
    id[i] = i - 'A' + 26 + 1, ch[i - 'A' + 26 + 1] = i;
  scanf("%d%d", &n, &tt);
  km.init(tt);
  scanf("%s", s + 1);
  scanf("%s", t + 1);
  for (int i = 1; i <= n; i++) km.add(id[s[i]], id[t[i]]);
  cout << km.solve() << endl;
  for (int i = 1; i <= tt; i++) cout << ch[km.mx[i]];
  return 0;
}
