#include using namespace std; #define REP(i,a,b) for(i=a;i s; int get_dist2(int dx, int dy){ return dx * dx + dy * dy; } int dfs(int now, int bef, int mn, int mx){ int i, j, k; int mnX, mxX, mnY, mxY; int nx, ny; int candX = -1, candY = -1, cnt = 0; int dame = 0; if(bef==-1){ mnX = mnY = 1000; mxX = mxY = 3000; } else { mnX = max(1, tmpX[bef] - mn); mxX = min(4000, tmpX[bef] + mn); mnY = max(1, tmpY[bef] - mn); mxY = min(4000, tmpY[bef] + mn); } for(;;){ if(dame>=100) return 0; nx = RAND * (mxX-mnX+1) + mnX; ny = RAND * (mxY-mnY+1) + mnY; if(s.count(nx*10000+ny)){ dame++; continue; } if(bef != -1){ k = get_dist2(tmpX[bef]-nx, tmpY[bef]-ny); if(k < mn*mn || k > mx*mx){ dame++; continue; } } dame = 0; candX = nx; candY = ny; if(pwA[candX] + pwB[candY] < S && cnt < 5){ cnt++; continue; } break; } tmpX[now] = candX; tmpY[now] = candY; s.insert(candX*10000+candY); rep(i,es[now]){ k = edge[now][i]; if(k==bef) continue; j = dfs(k, now, mnlen[now][i], mxlen[now][i]); if(!j) return 0; } return 1; } int dfs2(int now, int bef, int mn, int mx){ int i, j, k; int mnX, mxX, mnY, mxY; int nx, ny; int candX = -1, candY = -1, cnt = 0; int dame = 0; if(bef==-1){ mnX = mnY = 1; mxX = mxY = 100; } else { mnX = max(1, tmpX[bef] - mn); mxX = min(4000, tmpX[bef] + mn); mnY = max(1, tmpY[bef] - mn); mxY = min(4000, tmpY[bef] + mn); } for(;;){ if(dame>=100) return 0; nx = RAND * (mxX-mnX+1) + mnX; ny = RAND * (mxY-mnY+1) + mnY; if(s.count(nx*10000+ny)){ dame++; continue; } if(bef != -1){ k = get_dist2(tmpX[bef]-nx, tmpY[bef]-ny); if(k < mn*mn || k > mx*mx){ dame++; continue; } } dame = 0; candX = nx; candY = ny; if(pwA[candX] + pwB[candY] < S && cnt < 5){ cnt++; continue; } if(candX < 100 || candX > 3900) break; if(candY < 100 || candY > 3900) break; if(cnt < 50){ cnt++; continue; } break; } tmpX[now] = candX; tmpY[now] = candY; s.insert(candX*10000+candY); rep(i,es[now]){ k = edge[now][i]; if(k==bef) continue; j = dfs2(k, now, mnlen[now][i], mxlen[now][i]); if(!j) return 0; } return 1; } void doit(){ int i, j, k, cnt = 0; rep(i,N) es[i] = 0; rep(i,N-1){ j = P[i]; k = Q[i]; edge[j][es[j]] = k; mnlen[j][es[j]] = K[i]; mxlen[j][es[j]] = L[i]; edge[k][es[k]] = j; mnlen[k][es[k]] = K[i]; mxlen[k][es[k]] = L[i]; es[j]++; es[k]++; } pwA[0] = pwB[0] = 1; REP(i,1,4040){ pwA[i] = pwA[i-1] * A % 10007; pwB[i] = pwB[i-1] * B % 10007; } rep(i,N) tmpX[i] = -1; k = 0; while(k==0 && cnt < 5){ cnt++; s.clear(); k = dfs(0, -1, 0, 0); } while(k==0){ s.clear(); k = dfs2(0, -1, 0, 0); }; rep(i,N) resX[i] = tmpX[i], resY[i] = tmpY[i]; } int main(){ int i; srand(time(NULL)); scanf("%d",&T); while(T--){ scanf("%d",&N); scanf("%d%d%d",&A,&B,&S); rep(i,N-1) scanf("%d%d%d%d",P+i,Q+i,K+i,L+i), P[i]--, Q[i]--; doit(); rep(i,N) printf("%d %d\n",resX[i],resY[i]); } return 0; }