#include <bits/stdc++.h>
using namespace std;
int z, n, m, a, b, k, res;
string s1, s2;
int g[200][200];
int org[200][200];
int m1[200], m2[200];
int l1[200], l2[200], p[200], slack[200];
bool blue[200];
long long hungarian() {
  for (int i = 0; i < n; i++) {
    m1[i] = m2[i] = p[i] = -1;
    l1[i] = l2[i] = -1000000001;
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      l1[i] = max(l1[i], g[i][j]);
      l2[j] = max(l2[j], g[i][j]);
    }
  for (int k = 0; k < n; k++) {
    for (int i = 0; i < n; i++) slack[i] = 1000000001, p[i] = -1;
    for (int i = 0; i < n; i++)
      if (blue[i] = (m1[i] == -1)) {
        for (int j = 0; j < n; j++)
          slack[j] = min(slack[j], l1[i] + l2[j] - g[i][j]);
      }
    int u;
    while (true) {
      u = min_element(slack, slack + n) - slack;
      if (slack[u]) {
        int d = slack[u];
        for (int i = 0; i < n; i++) {
          if (blue[i]) l1[i] -= d;
          if (slack[i] == 1000000001)
            l2[i] += d;
          else
            slack[i] -= d;
        }
      } else {
        for (int i = 0; i < n; i++)
          if (blue[i] && g[i][u] == l1[i] + l2[u]) {
            p[u] = i;
            break;
          }
        slack[u] = 1000000001;
        if (m2[u] == -1) break;
        blue[m2[u]] = true;
        for (int i = 0; i < n; i++) {
          if (slack[i] != 1000000001)
            slack[i] = min(slack[i], l1[m2[u]] + l2[i] - g[m2[u]][i]);
        }
      }
    }
    while (u != -1) m2[u] = p[u], swap(u, m1[p[u]]);
  }
  long long result = 0;
  for (int i = 0; i < n; i++) result += g[i][m1[i]];
  return result;
}
vector<int> nbs[200], val;
int mate[2][200];
int mvc[2][200];
int vis[200];
int aug(int v) {
  if (vis[v]++) return 0;
  for (int i = 0; i < nbs[v].size(); i++) {
    int w = nbs[v][i];
    if (g[v][w]) continue;
    if (mate[1][w] == -1 || aug(mate[1][w])) {
      mate[1][w] = v;
      mate[0][v] = w;
      return 1;
    }
  }
  return 0;
}
int match() {
  int ret = 0;
  memset(mate, -1, sizeof(mate));
  for (int i = 0; i < n; i++) {
    memset(vis, 0, sizeof(vis));
    ret += aug(i);
  }
  return ret;
}
void cover_aug(int v) {
  if (mvc[1][v]) return;
  mvc[1][v] = 1;
  int mt = mate[1][v];
  for (int i = 0; i < nbs[mt].size(); i++) {
    int nb = nbs[mt][i];
    if (!g[mt][nb] && mate[1][nb] != -1 && mate[1][nb] != mt) cover_aug(nb);
  }
}
void cover() {
  memset(mvc, 0, sizeof(mvc));
  for (int i = 0; i < n; i++)
    if (mate[0][i] == -1)
      for (int j = 0; j < nbs[i].size(); j++)
        if (!g[i][nbs[i][j]]) cover_aug(nbs[i][j]);
  for (int i = 0; i < n; i++)
    mvc[0][i] = (mate[0][i] != -1 && !mvc[1][mate[0][i]]);
}
int id(char c) {
  if (c >= 'a') return c - 'a';
  return 26 + c - 'A';
}
char revid(int c) {
  if (c <= 25) return c + 'a';
  return c - 26 + 'A';
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> n;
  cin >> s1 >> s2;
  for (int i = 0; i < s1.size(); i++) {
    g[id(s1[i])][id(s2[i])]++;
    org[id(s1[i])][id(s2[i])]++;
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      g[i][j] = 1000000001 - g[i][j];
      nbs[i].push_back(j);
    }
  for (int i = 0; i < n; i++) {
    int mn = 1000000001;
    for (int j = 0; j < n; j++) mn = min(mn, g[i][j]);
    for (int j = 0; j < n; j++) g[i][j] -= mn;
  }
  for (int j = 0; j < n; j++) {
    int mn = 1000000001;
    for (int i = 0; i < n; i++) mn = min(mn, g[i][j]);
    for (int i = 0; i < n; i++) g[i][j] -= mn;
  }
  while (1) {
    if (match() == n) {
      int res = 0;
      for (int i = 0; i < n; i++) res += org[i][mate[0][i]];
      cout << res << endl;
      for (int i = 0; i < n; i++) cout << revid(mate[0][i]);
      cout << endl;
      break;
    }
    cover();
    int delta = 1000000001;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) {
        if (!mvc[0][i] && !mvc[1][j]) delta = min(delta, g[i][j]);
      }
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) {
        if (mvc[0][i] && mvc[1][j])
          g[i][j] += delta;
        else if (!mvc[0][i] && !mvc[1][j])
          g[i][j] -= delta;
      }
  }
  return 0;
}
