// competitive-verifier: PROBLEM https://onlinejudge.u-aizu.ac.jp/problems/DSL_1_B
#include <iostream>
#include "data_structure/potentialized_union_find.hpp"
int main(void) {
int n, q;
std::cin >> n >> q;
potentialized_union_find<int> uf(n);
while (q--) {
int com;
std::cin >> com;
if (com == 0) {
int x, y, w;
std::cin >> x >> y >> w;
uf.unite(x, y, w);
} else {
int x, y;
std::cin >> x >> y;
if (uf.same(x, y)) std::cout << uf.diff(x, y) << '\n';
else std::cout << '?' << '\n';
}
}
return 0;
}