#include #define N 100005 using namespace std; int n,m,k; int ans[N]; inline void Rd(int &res){ char c;res=0; while(c=getchar(),c<48); do res=(res<<3)+(res<<1)+(c^48); while(c=getchar(),c>47); return; } struct YDtree{ #define ls p<<1 #define rs p<<1|1 int sum[N<<2],ans[N<<2]; inline void down(int p){ sum[ls]+=sum[p]; sum[rs]+=sum[p]; sum[p]=0; } void make(int l,int r,int x,int f,int p){ if(l==r){ if(f>1; if(mid>=x)make(l,mid,x,f,ls); else make(mid+1,r,x,f,rs); } inline void init(){ memset(sum,0,sizeof(sum)); memset(ans,63,sizeof(ans)); make(1,n,k,m,1); } void update(int l,int r,int L,int R,int p){ if(L<=l&&r<=R){ sum[p]++; return; } int mid=(l+r)>>1; if(mid>=L)update(l,mid,L,R,ls); if(mid>1; if(mid>=x)return get_ans(l,mid,x,ls); return get_ans(mid+1,r,x,rs); } }YD; void init(){ YD.init(); } int main(){ // freopen("data.txt","r",stdin); int T; Rd(T); while(T--){ Rd(n);Rd(m);Rd(k); init(); for(int i=1,a,b;i<=m;i++){ Rd(a);Rd(b); if(a>b)swap(a,b); int a1=YD.get_ans(1,n,a,1),b1=YD.get_ans(1,n,b,1); if(a!=b){ if(a1<=m)YD.make(1,n,b,a1-1,1); if(b1<=m)YD.make(1,n,a,b1-1,1); if(a>1)YD.update(1,n,1,a-1,1); if(a+1m)printf("-1"); else printf("%d",ans); } puts(""); } return 0; }