#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void smax(T &x, T y) {
  x = max((x), (y));
}
template <class T>
inline void smin(T &x, T y) {
  x = min((x), (y));
}
const int MOD = 1e9 + 7;
const int SIZE = 1e5 + 10;
const long long INF = 1e15;
int n;
vector<vector<int> > g;
vector<pair<int, int> > edges;
vector<int> edgecost;
int indeg[SIZE];
int childcnt[SIZE];
int was[SIZE];
int other(int edge, int cur) {
  if (edges[edge].first == cur)
    return edges[edge].second;
  else
    return edges[edge].first;
}
void dfs(int u) {
  if (was[u]) return;
  was[u] = 1;
  childcnt[u] = 1;
  for (int i = 0; i < (((int)(g[u]).size())); ++i) {
    int v = other(g[u][i], u);
    if (!was[v]) {
      dfs(v);
      childcnt[u] += childcnt[v];
    }
  }
}
long long getedgeused(int edge) {
  pair<int, int> e = edges[edge];
  long long cnt1, cnt2;
  if (childcnt[e.first] < childcnt[e.second]) {
    cnt1 = childcnt[e.first];
    cnt2 = n - cnt1;
  } else {
    cnt1 = childcnt[e.second];
    cnt2 = n - cnt1;
  }
  long long ret = (long long)n * (n - 1) * (n - 2) -
                  (long long)cnt1 * (cnt1 - 1) * (cnt1 - 2) -
                  (long long)cnt2 * (cnt2 - 1) * (cnt2 - 2);
  return ret;
}
int main() {
  if (0) {
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
  }
  while (scanf("%d", &(n)) == 1) {
    g.clear();
    edges.clear();
    edgecost.clear();
    g.resize(n);
    edges.resize(n - 1);
    edgecost.resize(n - 1);
    memset((indeg), 0, sizeof((indeg)));
    int st = -1;
    for (int i = 0; i < (n - 1); ++i) {
      int a, b, l;
      scanf("%d%d%d", &a, &b, &l);
      a--, b--;
      edges[i].first = a;
      edges[i].second = b;
      edgecost[i] = l;
      g[a].push_back(i);
      g[b].push_back(i);
      indeg[a]++;
      indeg[b]++;
    }
    for (int i = 0; i < (n); ++i)
      if (indeg[i] == 1) st = i;
    memset((childcnt), 0, sizeof((childcnt)));
    memset((was), 0, sizeof((was)));
    dfs(st);
    double total = 0;
    for (int i = 0; i < (n - 1); ++i) {
      long long cnt = getedgeused(i);
      total += (double)cnt * edgecost[i] * 2;
    }
    int(q);
    scanf("%d", &q);
    while (q--) {
      int x, w;
      scanf("%d%d", &x, &w);
      x--;
      long long cnt = getedgeused(x);
      total -= (double)cnt * (edgecost[x] - w) * 2;
      printf("%.10f\n", total / ((long long)n * (n - 1) * (n - 2)));
      edgecost[x] = w;
    }
  }
  return 0;
}
