#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const long long N = 3e6 + 5e4 + 10;
const long long inf = 1e18 + 10ll;
const long long mod = 1e9 + 7;
const double eps = 1e-7;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
using namespace std;
long long q;
long long n;
string a;
string b;
long long reach[30];
long long isacyc[N];
bool used[30];
vector<long long> g[30];
bool ex[30];
void dfs(long long v) {
  used[v] = true;
  for (auto u : g[v])
    if (!used[u]) dfs(u);
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout.precision(20);
  cin >> q;
  while (q--) {
    cin >> n >> a >> b;
    for (long long i = 0; i < 30; ++i) g[i].clear();
    set<char> st;
    fill(ex, ex + 30, false);
    fill(reach, reach + 30, false);
    for (long long i = 0; i < n; ++i)
      if (a[i] != b[i]) {
        reach[a[i] - 'a'] |= (1ll << (b[i] - 'a'));
        g[a[i] - 'a'].push_back(b[i] - 'a');
        g[b[i] - 'a'].push_back(a[i] - 'a');
        st.insert(a[i]);
        st.insert(b[i]);
        ex[a[i] - 'a'] = true;
        ex[b[i] - 'a'] = true;
      }
    fill(isacyc, isacyc + N, false);
    fill(used, used + 30, false);
    isacyc[0] = true;
    long long comps = 0;
    for (long long i = 0; i < 30; ++i)
      if (ex[i] && !used[i]) {
        ++comps;
        dfs(i);
      }
    long long sz = st.size();
    long long mx = 0;
    for (long long i = 1; i < N; ++i) {
      bool haveall = true;
      long long cnt = 0;
      for (long long j = 0; j <= 20; ++j)
        if ((1ll << j) & i) {
          if (!ex[j]) {
            haveall = false;
            break;
          }
          ++cnt;
        }
      if (!haveall) continue;
      for (long long j = 0; j <= 20; ++j)
        if ((1ll << j) & i)
          isacyc[i] |= (isacyc[i ^ (1ll << j)] && (reach[j] & i) == 0);
      if (isacyc[i]) mx = max(mx, cnt);
    }
    long long ans = sz * 2 - comps - mx;
    cout << ans << "\n";
  }
}
