#include <bits/stdc++.h>
using namespace std;
#define N 100101
int m,n,root;
//
struct node{
int v,nxt,w;
}e[N<<1];
int first[N],cnt;
inline void add(int u,int v,int w){
e[++cnt].v=v;e[cnt].nxt=first[u];
first[u]=cnt;e[cnt].w=w;
}
int head[N],nxt[N],to[N],last;
inline void addtr(int u,int v){
nxt[++last]=head[u];head[u]=last;
to[last]=v;
}
//
struct edge{
int u,v,len;
}p[N];
inline bool cmp(const edge& a,const edge& b){
return a.len>b.len;
}
int f[N<<1],val[N<<1];
inline int getfa(int x){
return f[x]==x?x:f[x]=getfa(f[x]);
}
inline void merge(int x,int y){
x=getfa(x),y=getfa(y);
f[y]=x;
}
void kruscal(){
int tot=n;sort(p+1,p+m+1,cmp);
for(int i=1;i<=2*n-1;++i) f[i]=i;
for(int i=1;i<=m;++i){
int u=p[i].u,v=p[i].v,len=p[i].len;
u=getfa(u),v=getfa(v);
if(u!=v){
addtr(++tot,u);addtr(tot,v);
// printf("@%d %d %d\n",tot,u,v);
merge(tot,u);merge(tot,v);
val[tot]=len;
}
if(tot==2*n-1) break;
}
root=tot;
}
//
typedef pair<int,int> T;
int dis[N],vis[N];
void dijstra(){
memset(dis,0x3f,sizeof dis);
priority_queue< T,vector<T>,greater<T> > q;
q.push(make_pair(dis[1]=0,1));
while(!q.empty()){
T t=q.top();q.pop();
int u=t.second,d=t.first;
if(vis[u]) continue;
vis[u]=1;
for(int i=first[u];i;i=e[i].nxt){
int v=e[i].v,w=e[i].w;
if(dis[v]>w+d){
dis[v]=w+d;
q.push(make_pair(dis[v],v));
}
}
}
}
//
int fa[N<<1][20],siz[N<<1],st[N],pre[N],ed[N<<1],tot;
int dfs1(int u,int ff){
// printf("**%d\n",u);
fa[u][0]=ff;siz[u]=1;
int x=0x3f3f3f3f;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
x=min(x,dfs1(v,u));
siz[u]+=siz[v];
// printf("#%d %d\n",u,v);
}
if(siz[u]==1) x=st[u]=++tot,x,pre[tot]=u;
ed[u]=tot;
return x;
}
void init(){
for(int j=1;j<=19;j++)
for(int i=1;i<=n;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
}
int find(int x,int lim){
for(int j=19;j>=0;j--)
if(val[fa[x][j]]>lim) x=fa[x][j];
return x;
}
//
#define lc p<<1
#define rc p<<1|1
struct segment{
int l,r,minn;
}t[N<<2];
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;t[p].minn=0x3f3f3f3f;
if(l==r) return void(t[p].minn=dis[pre[l]]);
int mid=l+r>>1;
build(lc,l,mid);
build(rc,mid+1,r);
return void(t[p].minn=min(t[lc].minn,t[rc].minn));
}
int query(int p,int ql,int qr){
if(ql<=t[p].l&&t[p].r<=qr) return t[p].minn;
int mid=t[p].l+t[p].r>>1;
int ans=0x3f3f3f3f;
if(ql<=mid) ans=min(ans,query(lc,ql,qr));
if(qr>mid) ans=min(ans,query(rc,ql,qr));
return ans;
}
//
int solve(int x,int lim){
x=find(x,lim);
return query(1,st[x],ed[x]);
}
inline int rd(){
char c=getchar();int v=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') v=(v<<3)+(v<<1)+(c^48),c=getchar();
return v;
}
void clear(){
memset(first,0,sizeof first);
memset(head,0,sizeof head);
memset(fa,0,sizeof fa);
memset(vis,0,sizeof vis);
cnt=last=tot=0;
}
int main(){
freopen("1.in","r",stdin);
int type=rd();
while(type--){
n=rd(),m=rd();
for(int i=1;i<=m;++i){
int u=rd(),v=rd(),w=rd(),len=rd();
p[i].u=u,p[i].v=v,p[i].len=len;
add(u,v,w);add(v,u,w);
}
kruscal();
// printf("#%#$%d",root);
dfs1(root,0);init();
dijstra();
build(1,1,n);
int q=rd(),k=rd(),S=rd();
int lastans=0;
while(q--){
int u=(rd()+k*lastans-1)%n+1,lim=(rd()+k*lastans)%(S+1);
printf("%d\n",lastans=solve(u,lim));
}
clear();
}
return 0;
}
只过了两个点评测记录