#include <bits/stdc++.h>
using namespace std;
namespace fastIO {
bool IOerror = 0;
inline char nc() {
  static char buf[100000], *p1 = buf + 100000, *pend = buf + 100000;
  if (p1 == pend) {
    p1 = buf;
    pend = buf + fread(buf, 1, 100000, stdin);
    if (pend == p1) {
      IOerror = 1;
      return -1;
    }
  }
  return *p1++;
}
inline bool blank(char ch) {
  return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
inline long long read() {
  bool sign = 0;
  char ch = nc();
  long long x = 0;
  for (; blank(ch); ch = nc())
    ;
  if (IOerror) return 0;
  if (ch == '-') sign = 1, ch = nc();
  for (; ch >= '0' && ch <= '9'; ch = nc()) x = x * 10 + ch - '0';
  if (sign) x = -x;
  return x;
}
};  // namespace fastIO
using namespace fastIO;
struct edge {
  long long v, w;
};
vector<edge> e[1000010];
long long ans1 = 0, ans2 = 0, n, m;
long long siz[1000010];
void dfs(long long x, long long pre) {
  siz[x] = 1;
  for (auto i : e[x]) {
    if (i.v == pre) continue;
    dfs(i.v, x);
    siz[x] += siz[i.v];
    ans2 += i.w * min(siz[i.v], n - siz[i.v]);
  }
}
long long dfs1(long long x, long long pre) {
  long long ans = 0;
  for (auto i : e[x]) {
    if (i.v == pre) continue;
    ans += dfs1(i.v, x);
    ans += i.w * (siz[i.v] & 1);
  }
  return ans;
}
signed main() {
  long long t = read();
  while (t--) {
    n = read();
    n *= 2;
    for (long long i = 1; i < n; i++) {
      long long x = read(), y = read(), z = read();
      e[x].push_back((edge){y, z});
      e[y].push_back((edge){x, z});
    }
    ans1 = ans2 = 0;
    dfs(1, 1);
    cout << dfs1(1, 1) << ' ' << ans2 << '\n';
    for (long long i = 1; i <= n; i++) e[i].clear();
  }
  return 0;
}
