#include <bits/stdc++.h>
using namespace std;

#define int long long

const long long INF = 4e18;
const int N = 300000 + 5;

struct Edge{
    int to,w,id;
};

int n,m,k;
vector<Edge> adj[N];
long long dista[N];
bool vis[N];

vector<int> ans;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin>>n>>m>>k;

    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        adj[u].push_back({v,w,i});
        adj[v].push_back({u,w,i});
    }

    for(int i=1;i<=n;i++) dista[i]=INF;

    priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<pair<long long,int>>> pq;
    dista[1]=0;
    pq.push({0,1});

    while(!pq.empty()){
        auto [d,u]=pq.top();
        pq.pop();
        if(d!=dista[u]) continue;
        for(auto e:adj[u]){
            if(dista[e.to]>d+e.w){
                dista[e.to]=d+e.w;
                pq.push({dista[e.to],e.to});
            }
        }
    }

    queue<int> q;
    q.push(1);
    vis[1]=1;

    while(!q.empty() && (int)ans.size()<k){
        int u=q.front();
        q.pop();

        for(auto e:adj[u]){
            int v=e.to;
            if(!vis[v] && dista[u]+e.w==dista[v]){
                vis[v]=1;
                ans.push_back(e.id);
                q.push(v);
                if((int)ans.size()==k) break;
            }
        }
    }

    cout<<ans.size()<<"\n";
    for(int x:ans) cout<<x<<" ";
}