市政交通
时间限制:C/C++/Rust/Pascal 6秒,其他语言12秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
Special Judge, 64bit IO Format: %lld

题目描述

X市的交通线路可以抽象成为一颗树,点编号为 1 到 n。
X市有一些公交路线,每一个公交路线可以用一个二元组 (x,y) 来表示。每个公交车的路线是这样的:每天,若干班公交车从 x 出发沿着树上的唯一路径到达 y。
有若干次询问,每次询问的内容是对于某一条边 (u,v) 上,是否有公交车通过,如果没有,输出-1,如果有,输出任何一条通过该边的公交线路的起点和终点。
然而X市总是不断的施工,也就是说,可能某个时刻某条边会断开,同时这个时刻一定也有某条新边会出现,且任意时刻图都是一颗树。当然,公交总公司的兴趣也会不断变化,所以也有可能不断开通新线路或者取消原有的公交线路。

输入描述:

输入的第一行包含两个整数 n, m。
接下来 n-1 行,每行两个整数 u, v,代表这两个点之间有一条边。
接下来 m 行,每行描述一个操作。每行的第一个数为op:
如果 op = 1 ,接下来输入两个数x , y,表示从 x 到 y 的公交线路开通了,保证之前没有相同的线路。
如果 op = 2 ,接下来输入两个数x , y,表示从 x 到 y 的公交线路被取消了。
如果 op = 3 ,接下来输入两个数u , v, x, y,表示从 u 到 v 的边断开了,从 x 到 y 的边出现了。
如果 op = 4 ,接下来输入两个数u , v,表示询问从 u 到 v 的边对应的答案,你应当输出询问结果。

输出描述:

对于每一个 op = 4 的操作,你需要输出一个数 -1 或两个数,需为当前存在的一条公交线路。
示例1

输入

复制
5 6
1 2
2 3
3 4
3 5
1 4 5
4 2 3
3 3 5 1 5
4 2 3
2 4 5
4 1 2

输出

复制
-1
4 5
-1

备注: