#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
const long long mod = 1e9 + 7;
inline long long gcd(long long a, long long b) {
  return !b ? a : gcd(b, a % b);
}
inline long long q_pow(long long a, long long x) {
  long long ans = 1, tmp = a;
  while (x) {
    if (x & 1) (ans *= tmp) %= mod;
    (tmp *= tmp) %= mod;
    x >>= 1;
  }
  return ans;
}
template <typename T>
inline void re(T &N) {
  int f = 1;
  char c;
  while ((c = getchar()) < '0' || c > '9')
    if (c == '-') f = -1;
  N = c - '0';
  while ((c = getchar()) >= '0' && c <= '9') N = N * 10 + c - '0';
  N *= f;
}
int m, n, t = 1, st, en;
char a[N], b[N];
int Mp[30][30];
int req[30];
int p[30];
int dp[1 << 20];
int find(int x) {
  if (p[x] == x) return x;
  return p[x] = find(p[x]);
}
int merge(int x, int y) {
  if (find(x) == find(y)) return 0;
  p[find(x)] = find(y);
  return 1;
}
int main() {
  re(t);
  while (t--) {
    re(n);
    scanf("%s%s", a + 1, b + 1);
    int ok = 1;
    for (int i = 1; i <= n; i++)
      if (a[i] > b[i]) {
        ok = 0;
        break;
      }
    iota(p, p + 20, 0);
    memset(req, 0, sizeof(req));
    memset(dp, 0, sizeof(dp));
    int ans = 20;
    for (int i = 1; i <= n; i++)
      if (a[i] != b[i]) {
        req[a[i] - 'a'] |= 1 << (b[i] - 'a');
        ans += merge(a[i] - 'a', b[i] - 'a');
      }
    dp[0] = 1;
    int ma = -1;
    for (int x = 0; x < 1 << 20; x++)
      if (dp[x]) {
        ma = max(ma, __builtin_popcount(x));
        for (int i = 0; i < 20; i++)
          if (!(x >> i & 1) && !(x & req[i])) {
            int to = x | 1 << i;
            dp[to] |= dp[x];
          }
      }
    ans -= ma;
    printf("%d\n", ans);
  }
}
