#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
int head[N];
int dis[N], ecnt;
int fa[N];
int cat[2005][2005];
long long gcd(long long a, long long b) {
  return a % b == 0 ? b : gcd(b, a % b);
}
long long qpow(long long base, long long n) {
  long long ans = 1;
  while (n) {
    if (n & 1) ans = (ans * base) % mod;
    n >>= 1;
    base = base * base % mod;
  }
  return ans;
}
struct Node {
  long long x, y;
} nd[N];
struct EDGE {
  int u, v, nxt;
  long long w;
} e[N];
bool cmp(EDGE a, EDGE b) { return a.w < b.w; }
void add_edge(int u, int v, long long w) {
  e[ecnt].u = u;
  e[ecnt].v = v;
  e[ecnt].w = w;
  e[ecnt].nxt = head[u];
  head[u] = ecnt++;
}
int fd(int x) { return -1 == fa[x] ? x : fa[x] = fd(fa[x]); }
int m, n, x, k, c;
int vis[N];
int p[N];
int ct[N];
long long ans;
int C[55][55];
int dp[150][150];
int a[N], b[N];
struct H {
  int p, s;
  friend bool operator<(H a, H b) { return a.p < b.p; }
} he[N];
bool cmp(int a, int b) { return a > b; }
priority_queue<int> q;
vector<int> v;
map<vector<int>, int> mp;
int ar[N];
long long mi, mx;
void dfs(int u, int fa) {
  vis[u] = 1;
  for (int i = head[u]; i != -1; i = e[i].nxt) {
    int v = e[i].v;
    int w = e[i].w;
    if (v == fa) continue;
    dfs(v, u);
    mx += (long long)min(n - vis[v], vis[v]) * w;
    vis[u] += vis[v];
    if (vis[v] % 2 == 1) mi += w;
  }
}
int main() {
  int T;
  cin >> T;
  while (T--) {
    ecnt = 0;
    mi = mx = 0;
    memset(vis, 0, sizeof(vis));
    memset(head, -1, sizeof(head));
    cin >> n;
    n <<= 1;
    for (int i = 1; i <= n - 1; i++) {
      int u, v, w;
      cin >> u >> v >> w;
      add_edge(u, v, w);
      add_edge(v, u, w);
    }
    dfs(1, 0);
    printf("%lld %lld\n", mi, mx);
  }
  return 0;
}
