#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define int long long
#define ri register int
#define rd(n) n=read()
inline int read()
{
register int res=0,f=0;
register char c=getchar();
while(c<'0'||c>'9'){f^=(c=='-');c=getchar();}
while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+(c^48);c=getchar();}
return f?-res:res;
}
void fprint(int n)
{
if(n<0){putchar('-');n=-n;}
if(n>9) fprint(n/10);
putchar(n%10+48);
}
inline void print(int n)
{
fprint(n);
putchar(' ');
}
const int N=200005;
int t,n,m,k,x,y,z,ans,res,root,tot;
struct Graph{
int head,ver,Next;
#define ver(i) G[i].ver
#define head(i) G[i].head
#define Next(i) G[i].Next
}G[N];
int dep[N];
inline void add(int x,int y)
{
ver(++tot)=y;
Next(tot)=head(x);
head(x)=tot;
}
void dfs(int x,int fat)
{
dep[x]=dep[fat]+1;
for(ri i=head(x);i;i=Next(i))
{
ri y=ver(i);
if(y!=fat) dfs(y,x);
}
}
priority_queue<int,vector<int>,greater<int> >a,b;
signed main(void)
{
rd(t);
while(t--)
{
rd(n);
root=1; tot=0;
memset(G,0,sizeof(G));
for(ri i=1;i<n;++i)
{
rd(x); rd(y);
add(x,y);
add(y,x);
}
dfs(root,0);
for(ri i=1;i<=n;++i)
{
if(dep[i]&1) a.emplace(i);
else b.emplace(i);
}
x=a.size(); y=b.size();
if(n&1)
{
if(max(x,y)-min(x,y)!=1) puts("-1");
else
{
if(x>y)
{
for(ri i=1;i<=n;++i)
{
if(i&1)
{
print(a.top());
a.pop();
}
else
{
print(b.top());
b.pop();
}
}
}
if(x<y)
{
for(ri i=1;i<=n;++i)
{
if(i&1)
{
print(b.top());
b.pop();
}
else
{
print(a.top());
a.pop();
}
}
}
}
}
else
{
if(x!=y) puts("-1");
else
{
for(ri i=1;i<=n;++i)
{
if(i&1)
{
print(a.top());
a.pop();
}
else
{
print(b.top());
b.pop();
}
}
}
}
puts("");
while(a.size()) a.pop();
while(b.size()) b.pop();
}
return 0;
}