#include <bits/stdc++.h>
using namespace std;
struct edge {
  long long int u, v, index;
  long double w;
} adj[100005], adj1[100005];
long long int n, m, k;
long long int paren[100005];
long double cost[100005];
long long int ans[100005];
long long int parent(long long int v) {
  while (paren[v] != v) {
    paren[v] = paren[paren[v]];
    v = paren[v];
  }
  return v;
}
void initialize(long double mid) {
  memcpy(adj1, adj, sizeof(adj));
  long long int i;
  for (i = 1; i <= m; i++) {
    if (adj[i].u == 1 || adj[i].v == 1) adj[i].w += mid;
  }
}
long long int mst(long double mid) {
  long long int i, t = 0, count = 0;
  initialize(mid);
  sort(adj + 1, adj + m + 1, [](edge a, edge b) { return a.w < b.w; });
  for (i = 0; i <= n; i++) {
    paren[i] = i;
    ans[i] = 0;
  }
  for (i = 1; i <= m; i++) {
    long long int x = adj[i].u;
    long long int y = adj[i].v;
    long long int xset = parent(x);
    long long int yset = parent(y);
    if (xset != yset) {
      paren[xset] = yset;
      ans[++t] = adj[i].index;
      if (x == 1 || y == 1) {
        count++;
      }
    }
  }
  memcpy(adj, adj1, sizeof(adj1));
  return count;
}
long long int binarySearch() {
  long long int i, count = 0;
  long double l = -1000000, r = 1000000;
  long double mid = 0;
  for (i = 1; i <= 100; i++) {
    mid = (l + r) / 2;
    count = mst(mid);
    if (count == k) break;
    if (count < k)
      r = mid;
    else
      l = mid;
  }
  return count;
}
int main() {
  long long int count = 0, i, sum = 0;
  cin >> n >> m >> k;
  for (i = 1; i <= m; i++) {
    cin >> adj[i].u >> adj[i].v >> adj[i].w;
    cost[i] = adj[i].w;
    adj[i].index = i;
  }
  count = binarySearch();
  for (i = 1; i < n; i++) {
    sum += cost[ans[i]];
  }
  if (count == k) {
    cout << n - 1 << endl;
    for (i = 1; i < n; i++) cout << ans[i] << " ";
    cout << endl;
  } else
    cout << -1 << endl;
  return 0;
}
