namespace Graph {
class Edge {
public:
std::int32_t u, v;
std::int32_t other(std::int32_t x) const { return x ^ u ^ v; }
};
class WeightedEdge : public Edge {
public:
std::int32_t w;
};
template<typename Edge>
class Graph {
public:
std::vector<std::vector<std::int32_t>> adj;
std::vector<Edge> ed;
Graph(int n) { adj.resize(n); }
void addEdge(Edge edge) {
int32_t ed_idx = static_cast<int32_t>(ed.size());
ed.emplace_back(edge);
adj[edge.u].emplace_back(ed_idx);
adj[edge.v].emplace_back(ed_idx);
}
};
}