#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=3e5+5;
int n,m,k,dis[maxn];
struct edge
{
int u,v,w,nxt;
}e[maxn<<1];
int head[maxn],tot;
void add(int x,int y,int w)
{
e[++tot].u=x;
e[tot].v=y;
e[tot].nxt=head[x];
e[tot].w=w;
head[x]=tot;
}
struct node
{
int x,di;
int operator<(node s1)const
{
return di>s1.di;
}
};
int pre[maxn],bk[maxn];
void dij()
{
priority_queue<node> q;
q.push((node){1,0});
memset(dis,0x7f,sizeof dis);
dis[1]=0;
while(!q.empty())
{
node x=q.top();
q.pop();
if(bk[x.x])
continue;
bk[x.x]=1;
for(int i=head[x.x];i;i=e[i].nxt)
{
int v=e[i].v;
if(dis[v]>x.di+e[i].w)
{
dis[v]=x.di+e[i].w;
q.push((node){v,dis[v]});
pre[v]=i;
}
else if(dis[v]==x.di+e[i].w&&e[i].w<e[pre[v]].w)
pre[v]=i;
}
}
}
vector<pair<int,int> > g[maxn];
int d[maxn],qwq;
void top()
{
queue<int> q;
int t=0;
for(int i=1;i<=n;i++)
{
if(!d[i])
q.push(i);
}
while(!q.empty())
{
int x=q.front();
++t;
for(int i=0;i<g[x].size();i++)
{
int v=g[x][i].first;
bk[g[x][i].second]=0;
--d[v];
if(!d[v])
q.push(v);
}
if(n-1-t==k)
{
qwq=t;
break;
}
}
}
signed main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
dij();
memset(bk,0,sizeof bk);
for(int i=2;i<=n;i++)
{
bk[pre[i]]=1;
g[i].push_back(make_pair(e[pre[i]].u,pre[i]));
++d[e[pre[i]].u];
}
if(k>=n-1)
{
cout<<n-1<<endl;
for(int i=1;i<=tot;i++)
if(bk[i])
cout<<(i+1>>1)<<' ';
return 0;
}
top();
int t=0;
cout<<k<<endl;
for(int i=1;i<=tot;i++)
if(bk[i])
{
cout<<(i+1>>1)<<' ';
++t;
}
// if(t!=k)
// {
// cout<<"###"<<t<<' '<<qwq<<endl;
// for(int i=2;i<=n;i++)
// cout<<pre[i]<<endl;
// puts("!!!");
// }
return 0;
}
大概是输出多了