#include <bits/stdc++.h>
using namespace std;
int const maxn = (int)4e2 + 11;
int const inf = (1 << 30) - 1;
struct Edge {
  int from, to, cap, flow, cost;
  Edge(int _from, int _to, int _cap, int _flow, int _cost) {
    from = _from, to = _to, cap = _cap, flow = _flow, cost = _cost;
  }
  Edge() { from = to = cap = flow = cost = 0; }
};
Edge E[maxn * maxn];
vector<int> g[maxn];
int en;
int flow[maxn], from[maxn], ID[maxn], d[maxn];
int phi[maxn];
int p[maxn][maxn];
char second[(int)2e6 + 11];
char t[(int)2e6 + 11];
map<pair<int, int>, int> M;
int k;
int n;
void addEdge(int from, int to, int cap, int flow, int cost) {
  E[en++] = Edge(from, to, cap, flow, cost);
  g[from].push_back(en - 1);
  E[en++] = Edge(to, from, 0, -flow, -cost);
  g[to].push_back(en - 1);
}
bool Dijkstra(int start, int end) {
  memset(flow, 0, sizeof(flow));
  memset(from, -1, sizeof(from));
  memset(ID, 0, sizeof(ID));
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      pq;
  for (int i = start; i <= end; i++) d[i] = inf;
  flow[start] = inf;
  d[start] = 0;
  pq.push(make_pair(d[start], start));
  while (!pq.empty()) {
    pair<int, int> temp = pq.top();
    pq.pop();
    int val = temp.first;
    int u = temp.second;
    if (val > d[u]) continue;
    for (int i = 0; i < g[u].size(); i++) {
      int id = g[u][i];
      int v = E[id].to;
      if (E[id].cap - E[id].flow > 0 &&
          d[u] + E[id].cost + phi[u] - phi[v] < d[v]) {
        d[v] = d[u] + E[id].cost + phi[u] - phi[v];
        flow[v] = min(flow[u], E[id].cap - E[id].flow);
        ID[v] = id;
        from[v] = u;
        pq.push(make_pair(d[v], v));
      }
    }
  }
  for (int i = start; i <= end; i++) phi[i] += d[i];
  return flow[end] > 0;
}
void Solve() {
  en = 0;
  scanf("%d%d\n", &n, &k);
  scanf("%s\n", second);
  scanf("%s\n", t);
  for (int i = 0; i < n; i++) {
    M[make_pair(second[i], t[i])]--;
  }
  vector<char> v;
  for (int i = 0; i < 26; i++) {
    v.push_back(char(i + 'a'));
  }
  for (int i = 0; i < 26; i++) {
    v.push_back(char(i + 'A'));
  }
  for (int i = 0; i < k; i++) {
    for (int j = 0; j < k; j++) {
      addEdge(i + 1, k + 1 + j, 1, 0, M[make_pair(v[i], v[j])]);
    }
    addEdge(0, i + 1, 1, 0, 0);
    addEdge(i + 1 + k, k + k + 1, 1, 0, 0);
  }
  int end = k + k + 1;
  memset(phi, 0, sizeof(phi));
  int total = 0;
  while (Dijkstra(0, end)) {
    int v = end;
    while (v != 0) {
      int u = from[v];
      int id = ID[v];
      E[id].flow += flow[end];
      E[id ^ 1].flow -= flow[end];
      v = u;
    }
    total += flow[end];
  }
  int ans = 0;
  map<char, char> M;
  for (int i = 0; i < en; i++) {
    if (E[i].flow > 0 && E[i].from != 0 && E[i].to != end) {
      ans += E[i].cost;
      int from = E[i].from;
      int to = E[i].to;
      char aa = v[from - 1];
      char bb = v[to - k - 1];
      M[aa] = bb;
    }
  }
  printf("%d\n", -ans);
  for (int i = 0; i < k; i++) {
    cout << M[v[i]];
  }
  cout << endl;
}
int main() {
  Solve();
  return 0;
}
