# [数论] LOJ #508. 「LibreOJ NOI Round #1」失控的未来交通工具

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> abcd;

inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
}
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

const int N=1000005;

inline abcd GCD(ll a,ll b){
if (!b) return abcd(1,0);
abcd t=GCD(b,a%b);
return abcd(t.second,t.first-a/b*t.second);
}
inline ll calc(ll a,ll b,ll n){
abcd G=GCD(a,n); ll d=a*G.first+n*G.second;
if (b%d) return -1;
return (G.first*(b/d)%(n/d)+(n/d))%(n/d);
}

int n,m,Q;

int fat[N]; int g[N],dis[N];
inline int Fat(int u){
if (u==fat[u]) return u;
int f=fat[u];
fat[u]=Fat(fat[u]);
(dis[u]+=dis[f])%=m;
return fat[u];
}
inline void Merge(int x,int y,int w){
int fx=Fat(x),fy=Fat(y);
if (fx==fy){
int l=(dis[x]+dis[y])%m;
g[fx]=__gcd(__gcd(g[fx],2*w),w+l);
}else{
fat[fx]=fy; dis[fx]=((ll)w+m-dis[x]+m-dis[y])%m;
g[fy]=__gcd(__gcd(g[fy],g[fx]),2*dis[fx]);
}
}

int main(){
int order,u,v,x,b,c,w;
for (int i=1;i<=n;i++) fat[i]=i;
while (Q--){
if (order==1){
}else{
ll ans=0;
if (Fat(u)==Fat(v)){
int L=(dis[u]+dis[v])%m;
int g=__gcd(::g[Fat(u)],m);
int k=calc(b%g,((L-x)%g+g)%g,g);
if (k!=-1 && k<c){
int t=g/__gcd(g,b);
ans=(c-1-k)/t+1;
}
}
printf("%lld\n",ans);
}
}
return 0;
}