#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 ;   }   