#include <bits/stdc++.h>
using namespace std;
const int INF = numeric_limits<int>::max() / 4;
struct MinCostMaxFlow {
  int N;
  vector<vector<int> > cap, flow, cost;
  vector<int> found;
  vector<int> dist, pi, width;
  vector<pair<int, int> > dad;
  MinCostMaxFlow(int N)
      : N(N),
        cap(N, vector<int>(N)),
        flow(N, vector<int>(N)),
        cost(N, vector<int>(N)),
        found(N),
        dist(N),
        pi(N),
        width(N),
        dad(N) {}
  void AddEdge(int from, int to, int cap, int cost) {
    this->cap[from][to] = cap;
    this->cost[from][to] = cost;
  }
  void Relax(int s, int k, int cap, int cost, int dir) {
    int val = dist[s] + pi[s] - pi[k] + cost;
    if (cap && val < dist[k]) {
      dist[k] = val;
      dad[k] = make_pair(s, dir);
      width[k] = min(cap, width[s]);
    }
  }
  int Dijkstra(int s, int t) {
    fill(found.begin(), found.end(), false);
    fill(dist.begin(), dist.end(), INF);
    fill(width.begin(), width.end(), 0);
    dist[s] = 0;
    width[s] = INF;
    while (s != -1) {
      int best = -1;
      found[s] = true;
      for (int k = 0; k < N; k++) {
        if (found[k]) continue;
        Relax(s, k, cap[s][k] - flow[s][k], cost[s][k], 1);
        Relax(s, k, flow[k][s], -cost[k][s], -1);
        if (best == -1 || dist[k] < dist[best]) best = k;
      }
      s = best;
    }
    for (int k = 0; k < N; k++) pi[k] = min(pi[k] + dist[k], INF);
    return width[t];
  }
  pair<int, int> GetMaxFlow(int s, int t) {
    int totflow = 0, totcost = 0;
    while (int amt = Dijkstra(s, t)) {
      totflow += amt;
      for (int x = t; x != s; x = dad[x].first) {
        if (dad[x].second == 1) {
          flow[dad[x].first][x] += amt;
          totcost += amt * cost[dad[x].first][x];
        } else {
          flow[x][dad[x].first] -= amt;
          totcost -= amt * cost[x][dad[x].first];
        }
      }
    }
    return make_pair(totflow, totcost);
  }
};
long long int store[105][105];
int helper(char ch) {
  if (islower(ch)) return ch - 'a' + 1;
  return ch - 'A' + 27;
}
int main() {
  ios::sync_with_stdio(false);
  ;
  cin.tie(0);
  ;
  long long int i, j, n, k, x, y;
  string s, t;
  cin >> n >> k;
  cin >> s >> t;
  for (i = 0; i < n; i++) store[helper(s[i])][helper(t[i])]++;
  MinCostMaxFlow network(2 * k + 2);
  for (i = 1; i <= k; i++) {
    for (j = 1; j <= k; j++) network.AddEdge(i, j + k, 1, -store[i][j]);
  }
  for (i = 1; i <= k; i++) network.AddEdge(0, i, 1, 0);
  for (i = 1; i <= k; i++) network.AddEdge(i + k, 2 * k + 1, 1, 0);
  pair<long long int, long long int> p = network.GetMaxFlow(0, 2 * k + 1);
  cout << -p.second << "\n";
  for (i = 1; i <= k; i++) {
    for (j = 1; j <= k; j++) {
      if (network.flow[i][j + k] == 1) {
        if (j > 26)
          cout << char(j - 27 + 'A');
        else
          cout << char(j - 1 + 'a');
      }
    }
  }
  return 0;
}
