#include #include #include #include #include #include #include using namespace std; #define MAXN 505 #define MAXM 500150 struct edges { int to; int next; }edge[MAXM]; int nx,ny,n,m,en,k; int first[MAXN]; int cx[MAXN],cy[MAXN],distx[MAXN],disty[MAXN]; int que[MAXN],head,tail; int ans; int color[MAXN],cnt1,cnt2; int w[550][550]; void init() { memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); memset(first,-1,sizeof(first)); memset(w,0x3f3f3f3f,sizeof(w)); en=0;ans=0; } void add(int a, int b) { edge[en].to=b; edge[en].next=first[a]; first[a]=en++; } bool bfs() { int i,j,k; bool flag(0); int h,t; memset(distx,0,sizeof(distx)); memset(disty,0,sizeof(disty)); head=tail=0; for(i=1;i<=nx;i++) if (cx[i]==-1&&color[i]==1) que[tail++]=i; while(head!=tail) { for(h=head,t=tail;h!=t;h=(h+1)%MAXN) { i=que[h]; if(color[i]!=1) continue; for(k=first[i];k!=-1;k=edge[k].next) { j=edge[k].to; if(color[j]!=-1) continue; if(!disty[j]) { disty[j]=distx[i]+1; if (cy[j]==-1) flag=1; else { distx[cy[j]]=disty[j]+1; que[tail]=cy[j]; tail=(tail+1)%MAXN; } } } } head=t; } return flag; } bool dfs(int i) { int j, k; if(color[i]!=1) return 0; for(k=first[i];k!=-1;k=edge[k].next) { j=edge[k].to; if(color[j]!=-1) continue; if(disty[j]==distx[i]+1) { disty[j]=0; if(cy[j]==-1||dfs(cy[j])) { cx[i]=j,cy[j]=i; return 1; } } } return 0; } int Hopcroft_Karp() { int i,j; while(bfs()) for(i=1; i<=nx;i++) if(color[i]==1&&cx[i]==-1&&dfs(i)) ans++; return ans; } bool bipartite(int u,int c) { color[u]=c; if(c==1) cnt1++; else cnt2++; for(int i=first[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(color[v]==0) { if(!bipartite(v,-c)) return false; } else if(color[v]==color[u]) return false; } return true; } void Floyd(int n) { for (int k=1;k<=n;k++) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(w[i][j]>(w[i][k]+w[k][j])) { w[i][j]=w[i][k]+w[k][j]; } } } int main(){ //freopen("indata","r",stdin); //freopen("outdata","w",stdout); int t; int a,b,c; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&k); init(); for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); w[a][b] = w[b][a] = c; } // printf("notdone\n"); Floyd(n); //printf("fdone\n"); int knum = 0; for(int i = 1;i <= n;i ++){ for(int j = 1;j <= n;j ++){ if(i == j) continue; if(w[i][j] <= k) { add(i,j); knum ++; } } } knum/=2; if(n == 0&& knum == 0){ printf("0\n"); continue; } memset(color,0,sizeof(color)); bool ok=1; for(int i=1;i<=n;i++) if(color[i]==0) { cnt1=cnt2=0; if(!bipartite(i,1)) ok=0; if(cnt1!=cnt2) ok=0; } if(!ok || n%2==1) { // printf("%d %d\n",ok,n%2 ); printf("Impossible\n"); continue; } nx=ny=n; if(Hopcroft_Karp()!=n/2) { //printf("hk\n"); printf("Impossible\n"); continue; } printf("%d\n",ans); for(int i=1;i<=n;i++) { if(i==1) printf("%d",i); else if(color[i]==color[1]) printf(" %d",i ); } printf("\n"); } return 0; }