#include <bits/stdc++.h>
using namespace std;
vector<int> son[100005];
struct edge {
  int next, to, val;
} e[100005 << 1];
int n, k, u, v, w, cnt, h[100005], f[100005][2], val[100005];
void add(int x, int y, int z) {
  e[++cnt].val = z;
  e[cnt].to = y;
  e[cnt].next = h[x];
  h[x] = cnt;
}
bool cmp(int x, int y) { return val[x] > val[y]; }
void dfs(int x, int fa) {
  int res = 0;
  for (int i = h[x]; i; i = e[i].next) {
    int y = e[i].to;
    if (y == fa) continue;
    dfs(y, x);
    val[y] = f[y][0] + e[i].val;
    son[x].push_back(y);
  }
  sort(son[x].begin(), son[x].end(), cmp);
  for (int i = 0; i < son[x].size(); i++) {
    f[x][0] += val[son[x][i]];
    if (i >= k - 2) break;
  }
  for (int i = 0; i < son[x].size(); i++) {
    res += val[son[x][i]];
    if (i >= k - 1) break;
  }
  for (int i = 0; i < son[x].size(); i++) {
    f[x][1] = max(f[x][1], res - f[son[x][i]][0] + f[son[x][i]][1]);
    if (i >= k - 1) break;
  }
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i < n; i++) {
    scanf("%d%d%d", &u, &v, &w);
    u++;
    v++;
    add(u, v, w);
    add(v, u, w);
  }
  dfs(1, 0);
  printf("%d\n", f[1][1]);
  return 0;
}
