rt,WA求调
#include<bits/stdc++.h>
using namespace std;
int fa[100010][31],dep[100010],cst[100010][31];
int a[100010],t[100010];
struct edge{
int to,w,nxt;
}e[200010];
int head[200010],cnt;
void add(int u,int v,int w){
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs(int rt,int fn){
fa[rt][0]=fn;
dep[rt]=dep[fa[rt][0]]+1;
for(int i=1;i<31;i++){
fa[rt][i]=fa[fa[rt][i-1]][i-1];
cst[rt][i]=cst[fa[rt][i-1]][i-1]+cst[rt][i-1];
}
for(int i=head[rt];i;i=e[i].nxt){
if(e[i].to==fn)
continue;
cst[e[i].to][0]=e[i].w;
dfs(e[i].to,rt);
}
}
int lca(int x,int y){
if(dep[x]>dep[y])
swap(x,y);
int tmp=dep[y]-dep[x],ans=0;
for(int i=0;tmp;i++,tmp>>=1){
if(tmp&1){
ans+=cst[y][i];
y=fa[y][i];
}
}
if(y==x)
return ans;
for(int i=30;i>=0&&x!=y;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
ans+=cst[x][i]+cst[y][i];
}
}
ans+=cst[x][0]+cst[y][0];
return ans;
}
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=0;i<=n+1;i++)
e[i].to=e[i].w=e[i].nxt=0;
memset(head,0,sizeof(head));
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
memset(fa,0,sizeof(fa));
memset(dep,0,sizeof(dep));
memset(cst,0,sizeof(cst));
cnt=0;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
add(u,v,1);
add(v,u,1);
}
dfs(1,0);
cnt=0;
a[++cnt]=1;
t[a[cnt]]++;
int lst=0;
bool f=0;
for(int i=2;i<=n;i++){
if(t[i]==1)
continue;
if(lca(a[cnt],i)%2==1){
a[++cnt]=i;
t[a[cnt]]++;
if(f){
i=lst;
f=0;
continue;
}
}
else{
lst=i;
f=1;
}
}
f=0;
for(int i=1;i<=n;i++){
if(t[a[i]]!=1){
cout<<-1<<endl;
f=1;
break;
}
}
if(f)
continue;
for(int i=1;i<=cnt;i++)
cout<<a[i]<<' ';
cout<<endl;
}
return 0;
}