struct Graph {
    struct Edge {
        int v, u;
        Edge(int _v, int _u) : v(_v), u(_u) {}
    };

    int n;
    vector<Edge> edges;
    vector<vector<int>> adj;

    Graph(int _n) : n(_n) { adj.resize(n); }

    void add_edge(int v, int w, int u) {
        adj[v].push_back(edges.size());
        edges.push_back(Edge(w, u));
        adj[w].push_back(edges.size());
        edges.push_back(Edge(v, 0));
    }
};
