#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
struct edge {
  int to, nxt, val;
} e[maxn << 1];
int head[maxn], cnt;
void add(int x, int y, int z) {
  e[++cnt].to = y;
  e[cnt].nxt = head[x];
  head[x] = cnt;
  e[cnt].val = z;
}
int n, k;
struct point {
  int x, v0, v1;
};
int f[maxn][2];
vector<point> v[maxn];
vector<int> s[maxn];
bool cmp(point x, point y) { return x.v0 > y.v0; }
int Gets(int x, int l, int r) {
  if (l == 0) return s[x][r];
  return s[x][r] - s[x][l - 1];
}
void dfs(int x, int fa) {
  for (int i = head[x]; i; i = e[i].nxt) {
    int t = e[i].to;
    if (t == fa) continue;
    dfs(t, x);
    v[x].push_back((point){t, f[t][0] + e[i].val, f[t][1]});
  }
  sort(v[x].begin(), v[x].end(), cmp);
  int sz = v[x].size();
  if (!sz) return;
  for (int i = 0; i < sz; i++) {
    f[x][0] += v[x][i].v0;
    if (i >= k - 2) break;
  }
  s[x].push_back(v[x][0].v0);
  int sum = 0;
  for (int i = 0; i < v[x].size(); ++i) {
    sum += v[x][i].v0;
    if (i >= k - 1) break;
  }
  for (int i = 0; i < sz; i++) {
    f[x][1] = max(f[x][1], sum + f[v[x][i].x][1] - f[v[x][i].x][0]);
    if (i >= k - 1) break;
  }
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i < n; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    x++, y++;
    add(x, y, z), add(y, x, z);
  }
  dfs(1, 0);
  printf("%d\n", max(f[1][0], f[1][1]));
  return 0;
}
