#include <bits/stdc++.h>
using namespace std;
const long long inf = LLONG_MAX;
struct minimum_cost_bipartite_matching {
  int nl, nr;
  long long mc = 0;
  vector<int> ml, mr, ly;
  minimum_cost_bipartite_matching(int nl, int nr, vector<vector<long long>> &c)
      : nl(nl), nr(nr), ml(nl, -1), mr(nr, -1), ly(nr) {
    vector<long long> s(nl), t(nr);
    for (int i = 0; i < nl; i++) {
      int x = i, y = -1;
      vector<bool> u(nr);
      vector<long long> md(nr, inf);
      while (x != -1) {
        long long ny = -1, d = inf;
        for (int j = 0; j < nr; j++)
          if (!u[j]) {
            long long v = c[x][j] - s[x] - t[j];
            if (v < md[j]) md[j] = v, ly[j] = y;
            if (md[j] < d) d = md[j], ny = j;
          }
        s[i] += d;
        mc += d;
        for (int j = 0; j < nr; j++)
          if (u[j])
            s[mr[j]] += d, t[j] -= d;
          else
            md[j] -= d;
        y = ny;
        u[y] = true;
        x = mr[y];
      }
      while (y != -1) {
        mr[y] = ly[y] != -1 ? mr[ly[y]] : i;
        ml[mr[y]] = y;
        y = ly[y];
      }
    }
  }
};
int charToInt(char c) { return c >= 'a' && c <= 'z' ? c - 'a' : c - 'A' + 26; }
char intToChar(int c) { return c < 26 ? 'a' + c : 'A' + c - 26; }
int main() {
  int n, k;
  cin >> n >> k;
  string s[2];
  cin >> s[0] >> s[1];
  vector<vector<long long>> c(k, vector<long long>(k));
  for (int i = 0; i < n; i++) c[charToInt(s[0][i])][charToInt(s[1][i])]--;
  minimum_cost_bipartite_matching mcbm(k, k, c);
  cout << -mcbm.mc << "\n";
  for (int i = 0; i < k; i++) cout << intToChar(mcbm.ml[i]);
  cout << "\n";
}
