#include <bits/stdc++.h>
using namespace std;
using vi = std::vector<int>;
using vvi = std::vector<vi>;
using pii = std::pair<int, int>;
using vpii = std::vector<pii>;
struct Jury {
  vi perm;
  vpii edges;
  int getN() { return ((int)(perm).size() - 1) / 2; }
  Jury(int n) : perm(1 + 2 * n, 0) {
    for (int i = 1; i <= 2 * n; i++) perm[i] = i;
  }
  char ask(int a, int b) {
    if (perm[a] < perm[b]) {
      edges.emplace_back(a, b);
      return '<';
    }
    assert(perm[a] > perm[b]);
    edges.emplace_back(b, a);
    return '>';
  }
  bool next() {
    edges.clear();
    return std::next_permutation(perm.begin() + 1, perm.end());
  }
  bool check() {
    int n = ((int)(perm).size() - 1) / 2;
    vi a{0}, ind{0};
    for (int i = n + 1; i <= 2 * n; i++) {
      a.push_back(i);
    }
    for (int i = 1; i <= 2 * n; i++) {
      if (perm[i] > n) ind.push_back(i);
    }
    std::sort((a).begin(), (a).end());
    vvi answers;
    vi backup = perm;
    do {
      vi save = perm;
      for (int i = 1; i <= n; i++) {
        perm[ind[i]] = a[i];
      }
      bool ok = true;
      for (auto &[a, b] : edges) {
        ok &= perm[a] < perm[b];
      }
      if (ok) {
        answers.push_back(perm);
      }
      perm = save;
    } while (std::next_permutation(a.begin() + 1, a.end()));
    perm = backup;
    if ((int)(answers).size() == 1) {
      std::cout << "Wrong Answer on testcase";
      for (int i = 1; i <= 2 * n; i++) {
        std::cout << ' ' << perm[i];
      }
      std::cout << std::endl;
      std::cout << "order of indexes";
      for (int i = 1; i <= n; i++) {
        std::cout << ' ' << ind[i];
      }
      std::cout << " is strictly defined!" << std::endl;
      std::cout << "you determined that these condition holds:" << std::endl;
      perm = answers.back();
      for (auto &[a, b] : edges) {
        std::cout << a << '<' << b << "( means p[" << a << "]=" << perm[a]
                  << " < "
                  << "p[" << b << "] = " << perm[b] << std::endl;
      }
      return false;
    } else {
      assert((int)(answers).size() > 1);
      for (int i = 1; i <= 2 * n; i++) {
        if (i > 1) std::cout << ' ';
        std::cout << perm[i];
      }
      std::cout << ": OK" << std::endl;
      return true;
    }
  }
} jury(3);
bool test;
int getN() {
  if (test) return jury.getN();
  int n;
  cin >> n;
  return n;
}
char ask(int a, int b) {
  if (test) return jury.ask(a, b);
  cout << "? " << a << ' ' << b << endl;
  char res;
  cin >> res;
  return res;
}
void checkAnsw() {
  if (test) {
    if (jury.check()) {
      if (!jury.next()) {
        std::exit(0);
      }
    } else {
      getchar();
      getchar();
      std::exit(0);
    }
  } else
    cout << '!' << endl;
}
void bfs(vector<vector<int>> &g, vector<pii> &arr, int start, int less_ind) {
  int n = g.size();
  queue<int> q;
  q.push(start);
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    if (!g[cur][less_ind]) {
      ++arr[cur].first;
      ++arr[less_ind].second;
      g[less_ind][cur] = -1;
      g[cur][less_ind] = 1;
      for (int i = 0; i < n; ++i)
        if (g[cur][i] == -1) q.push(i);
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  test = false;
  int t;
  if (test)
    t = 2e9;
  else
    cin >> t;
  while (t--) {
    int hn = getN();
    int n = hn << 1;
    vector<vector<int>> g(n, vector<int>(n));
    vector<pii> arr;
    vector<int> losers;
    arr.reserve(n);
    losers.reserve(hn);
    for (int i = 1; i < n; i += 2) {
      pii a = {1, 0}, b = {1, 0};
      char res = ask(i, i + 1);
      if (res == '<') {
        losers.push_back(i);
        ++b.first;
        ++a.second;
        g[i - 1][i] = -1;
        g[i][i - 1] = 1;
      } else {
        losers.push_back(i + 1);
        ++a.first;
        ++b.second;
        g[i][i - 1] = -1;
        g[i - 1][i] = 1;
      }
      arr.push_back(a);
      arr.push_back(b);
    }
    for (int i = 0; i < hn; ++i)
      for (int j = i + 1; j < hn; ++j) {
        int ind = losers[i];
        int jnd = losers[j];
        if (!g[ind - 1][jnd - 1]) {
          char res = ask(ind, jnd);
          int less_ind = ind - 1, start = jnd - 1;
          if (res == '>') swap(less_ind, start);
          bfs(g, arr, start, less_ind);
        }
      }
    int found = 0;
    while (found < hn) {
      pii mina = {2e9, 2e9}, minb = {2e9, 2e9};
      int mini = -1, minj = -1;
      for (int i = 0; i < n; ++i) {
        if (arr[i] < mina) {
          swap(mina, minb);
          swap(mini, minj);
          mina = arr[i];
          mini = i;
        } else if (arr[i] < minb) {
          minb = arr[i];
          minj = i;
        }
      }
      if (mina.first < minb.first) {
        arr[mini] = {2e9, 2e9};
        ++found;
      } else {
        char res = ask(mini + 1, minj + 1);
        int less_ind = mini, start = minj;
        if (res == '>') swap(less_ind, start);
        bfs(g, arr, start, less_ind);
      }
    }
    checkAnsw();
  }
  return 0;
}
