#include <bits/stdc++.h>
using namespace std;
inline int init() {
  int now = 0, ju = 1;
  char c;
  bool flag = false;
  while (1) {
    c = getchar();
    if (c == '-')
      ju = -1;
    else if (c >= '0' && c <= '9') {
      now = now * 10 + c - '0';
      flag = true;
    } else if (flag)
      return now * ju;
  }
}
inline long long llinit() {
  long long now = 0, ju = 1;
  char c;
  bool flag = false;
  while (1) {
    c = getchar();
    if (c == '-')
      ju = -1;
    else if (c >= '0' && c <= '9') {
      now = now * 10 + c - '0';
      flag = true;
    } else if (flag)
      return now * ju;
  }
}
struct edge {
  int from, to, val, pre;
};
vector<edge> v[100002];
int t[100005], sz[100005], n;
double ans;
bool cmp(edge a, edge b) {
  return 1LL * t[a.to] * sz[b.to] < 1LL * t[b.to] * sz[a.to];
}
void addedge(int from, int to, int val) {
  v[from].push_back((edge){from, to, val, 0});
}
void predfs(int now, int fa) {
  sz[now]++;
  for (int i = 0; i < v[now].size(); i++) {
    if (v[now][i].to != fa) {
      t[v[now][i].to] += 2 * v[now][i].val;
      predfs(v[now][i].to, now);
      t[now] += t[v[now][i].to];
      sz[now] += sz[v[now][i].to];
    }
  }
  return;
}
void nextdfs(int now, int fa, int tim) {
  sort(v[now].begin(), v[now].end(), cmp);
  ans += tim;
  for (int i = 0; i < v[now].size(); i++) {
    if (v[now][i].to != fa) {
      nextdfs(v[now][i].to, now, tim + v[now][i].val);
      tim += t[v[now][i].to];
    }
  }
}
int main() {
  int x, y, z;
  n = init();
  for (int i = 1; i < n; i++) {
    x = init();
    y = init();
    z = init();
    addedge(x, y, z);
    addedge(y, x, z);
  }
  predfs(1, -1);
  nextdfs(1, -1, 0);
  ans /= (n - 1);
  printf("%.7f", ans);
  return 0;
}
