#include <bits/stdc++.h>
using namespace std;
template <int N>
struct bigraph {
  int mid;
  int cap[N][N];
  int potential[N];
  bool rev[N][N];
  bool used[N];
  bigraph() {
    fill(cap[0], cap[0] + N * N, 1000000000);
    fill(rev[0], rev[0] + N * N, false);
    fill(potential, potential + N, 0);
  }
  void setEdge(int a, int b, int capacity) {
    cap[a][b] = capacity;
    used[a] = true;
    used[b] = true;
  }
  bool explr[N];
  bool inMatch[N];
  bool dfs(int pos) {
    if (explr[pos]) return false;
    explr[pos] = true;
    if (pos >= mid && !inMatch[pos]) {
      inMatch[pos] = true;
      return true;
    }
    for (int i = 0; i < N; i++)
      if (potential[pos] + potential[i] == cap[pos][i])
        if (dfs(i)) {
          swap(cap[pos][i], cap[i][pos]);
          inMatch[pos] = true;
          return true;
        }
    return false;
  }
  void solve() {
    fill(inMatch, inMatch + N, false);
    int matched = 0, tomatch = 0;
    for (int i = 0; i < mid; i++)
      if (used[i]) tomatch++;
    while (matched < tomatch) {
      fill(explr, explr + N, false);
      bool augmented = false;
      for (int i = 0; i < mid && !augmented; i++)
        if (used[i] && !inMatch[i])
          if (dfs(i)) augmented = true;
      if (!augmented) {
        int inc = 1000000000;
        for (int i = 0; i < mid; i++)
          for (int j = mid; j < N; j++)
            if (explr[i] && !explr[j])
              inc = min(inc, cap[i][j] - potential[i] - potential[j]);
        for (int i = 0; i < mid; i++)
          if (explr[i]) potential[i] += inc;
        for (int i = mid; i < N; i++)
          if (explr[i]) potential[i] -= inc;
      }
      matched += augmented;
    }
  }
};
int n, k, corr[52][52], cind[256];
string a, b, base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
bigraph<104> g;
int main() {
  for (char c = 'a'; c <= 'z'; c++) cind[int(c)] = c - 'a';
  for (char c = 'A'; c <= 'Z'; c++) cind[int(c)] = c - 'A' + ('z' - 'a' + 1);
  g.mid = 52;
  cin >> n >> k >> a >> b;
  for (unsigned int i = 0; i < a.size(); i++)
    corr[cind[int(a[i])]][cind[int(b[i])]]++;
  for (int i = 0; i < k; i++)
    for (int j = 0; j < k; j++) g.setEdge(i, 52 + j, n - corr[i][j]);
  g.solve();
  int ret = n * k;
  for (int i = 0; i < 104; i++) ret -= g.potential[i];
  cout << ret << '\n';
  for (int i = 0; i < k; i++)
    for (int j = 0; j < k; j++)
      if (g.cap[g.mid + j][i] < 1000000000) cout << base[j];
  cout << '\n';
  return 0;
}
