#include <bits/stdc++.h>
using namespace std;
template <typename T>
istream& operator>>(istream& is, vector<T>& v) {
  for (auto& it : v) is >> it;
  return is;
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, vector<T> V) {
  os << "[ ";
  for (auto v : V) os << v << " ";
  return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> second) {
  os << "{ ";
  for (auto s : second) os << s << " ";
  return os << "}";
}
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cout << name << " : " << arg1 << '\n';
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cout.write(names, comma - names) << " : " << arg1 << " |";
  __f(comma + 1, args...);
}
vector<int> hungarianMethod(vector<vector<int>> W) {
  int n = ((int)(W).size()), m = ((int)(W[0]).size()), PHI = -1, NOL = -2,
      INF = 1e9;
  vector<vector<bool>> x(n, vector<bool>(m));
  vector<bool> ss(n), st(m);
  int f = 0;
  for (int i = 0; i < n; i++) {
    f = max(f, (*max_element(W[i].begin(), W[i].end())));
  }
  vector<int> u(n, f), v(m), p(m, INF), ls(n, PHI), lt(m, NOL), a(n, -1);
  while (true) {
    f = -1;
    for (int i = 0; i < n and f == -1; i++) {
      if (ls[i] != NOL and ss[i] == 0) {
        f = i;
      }
    }
    if (f != -1) {
      ss[f] = true;
      for (int j = 0; j < m; j++) {
        if (x[f][j] == 0 and u[f] + v[j] - W[f][j] < p[j]) {
          lt[j] = f;
          p[j] = u[f] + v[j] - W[f][j];
        }
      }
    } else {
      for (int i = 0; i < m and f == -1; i++) {
        if (lt[i] != NOL and st[i] == 0 and p[i] == 0) {
          f = i;
        }
      }
      if (f == -1) {
        int d1 = INF, d2 = INF, d;
        for (int i : u) {
          d1 = min(d1, (i));
        }
        for (int i : p) {
          if (i > 0) {
            d2 = min(d2, (i));
          }
        }
        d = min(d1, d2);
        for (int i = 0; i < n; i++) {
          if (ls[i] != NOL) {
            u[i] -= d;
          }
        }
        for (int i = 0; i < m; i++) {
          if (p[i] == 0) {
            v[i] += d;
          }
          if (p[i] > 0 and lt[i] != NOL) {
            p[i] -= d;
          }
        }
        if (d2 >= d1) {
          break;
        }
      } else {
        st[f] = true;
        int s = -1;
        for (int i = 0; i < n and s == -1; i++) {
          if (x[i][f]) {
            s = i;
          }
        }
        if (s == -1) {
          for (int l, r;; f = r) {
            r = f;
            l = lt[r];
            if (r >= 0 and l >= 0) {
              x[l][r] = !x[l][r];
            } else {
              break;
            }
            r = ls[l];
            if (r >= 0 and l >= 0) {
              x[l][r] = !x[l][r];
            } else {
              break;
            }
          }
          fill(p.begin(), p.end(), INF);
          fill(lt.begin(), lt.end(), NOL);
          fill(ls.begin(), ls.end(), NOL);
          fill(ss.begin(), ss.end(), false);
          fill(st.begin(), st.end(), false);
          for (int i = 0; i < n; i++) {
            bool ex = true;
            for (int j = 0; j < m and ex; j++) {
              ex = !x[i][j];
            }
            if (ex) {
              ls[i] = PHI;
            }
          }
        } else {
          ls[s] = f;
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (x[i][j]) {
        a[j] = i;
      }
    }
  }
  return a;
}
void solve() {
  map<char, int> ind;
  map<int, char> revInd;
  for (char ch = 'a'; ch <= 'z'; ++ch) {
    ind[ch] = ch - 'a';
    revInd[ind[ch]] = ch;
  }
  for (char ch = 'A'; ch <= 'Z'; ++ch) {
    ind[ch] = (ch - 'A') + 26;
    revInd[ind[ch]] = ch;
  }
  int n, k;
  cin >> n >> k;
  string a, b;
  cin >> a >> b;
  vector<vector<int>> W(k, vector<int>(k, 1));
  for (int i = 0; i < n; ++i) {
    W[ind[a[i]]][ind[b[i]]]++;
  }
  vector<int> matching = hungarianMethod(W);
  int ans = 0;
  string res(k, '$');
  for (int i = 0; i < k; ++i) {
    ans += W[matching[i]][i] - 1;
    res[matching[i]] = revInd[i];
  }
  cout << ans << '\n' << res << '\n';
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int T = 1;
  while (T--) {
    solve();
  }
  return 0;
}
