#include <bits/stdc++.h>
using namespace std;
int n, m, k;
struct node {
  int x, y, w;
  int no;
} edge[100005];
const int maxn = 1e5 + 5;
double mid;
bool cmp(const node &a, const node &b) {
  double a1 = a.w, b1 = b.w;
  if (a.x == 1 || a.y == 1) a1 += mid;
  if (b.x == 1 || b.y == 1) b1 += mid;
  if (fabs(a1 - b1) < 1e-8) {
    if (a.x == 1 || a.y == 1)
      return 1;
    else
      return 0;
  }
  return a1 < b1;
}
int pre[maxn];
int getx(int x) {
  if (pre[x] == x) return x;
  return pre[x] = getx(pre[x]);
}
int cc = 0;
int du = 0;
vector<int> ans;
void solve() {
  sort(edge, edge + m, cmp);
  cc = 0;
  du = 0;
  ans.clear();
  int ck = 0;
  for (int i = 0; i <= n; i++) pre[i] = i;
  for (int i = 0; i < m; i++) {
    int xx = getx(edge[i].x);
    int yy = getx(edge[i].y);
    if (xx != yy) {
      if (edge[i].x == 1 || edge[i].y == 1) {
        if (du >= k) continue;
        du++;
      }
      pre[xx] = yy;
      ans.push_back(edge[i].no);
      cc++;
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  int cnt = 0;
  for (int i = 0; i < m; i++) {
    int x, y, w;
    scanf("%d%d%d", &x, &y, &w);
    edge[i] = {x, y, w, i + 1};
    if (x == 1 || y == 1) cnt++;
  }
  if (n == 1) {
    if (k <= 0) {
      printf("0\n");
    } else
      printf("-1\n");
    return 0;
  }
  if (cnt < k || (n > 1 && k == 0)) {
    printf("-1\n");
    return 0;
  }
  double l = -1e6;
  double r = 1e6;
  mid = 0;
  solve();
  if (cc < n - 1) {
    printf("-1\n");
    return 0;
  }
  double cans = -1;
  const double esp = 1e-7;
  while (l <= r) {
    mid = (l + r) / 2;
    solve();
    if (du >= k) {
      cans = mid;
      l = mid + esp;
    } else
      r = mid - esp;
  }
  mid = cans;
  solve();
  if (du == k) {
    printf("%d\n", (int)ans.size());
    for (int it : ans) printf("%d ", it);
  } else
    printf("-1\n");
  return 0;
}
