// manifest T(s)T #include using namespace std; const int N = 2e5 + 16; struct Edge { int u, v; }; int n, m, q, ans[N]; Edge e[N], Q[N]; multiset > S; struct DSU { int par[N]; bool power[N]; vector v[N]; void init(int n) { for (int i = 1; i <= n; ++i) { par[i] = i; power[i] = (i == 1); if (i != 1) v[i].push_back(i); } } int find(int u) { if (par[u] == u) return u; return par[u] = find(par[u]); } void unite(int x, int y, int t) { x = find(x); y = find(y); if (x == y) return; if (!power[x] && !power[y]) { if (v[x].size() < v[y].size()) swap(x, y); par[y] = x; for (int node : v[y]) v[x].push_back(node); v[y].clear(); } else if (power[x] && !power[y]) { for (int node : v[y]) ans[node] = t; v[y].clear(); par[y] = x; } else if (!power[x] && power[y]) { for (int node : v[x]) ans[node] = t; v[x].clear(); par[x] = y; } else par[y] = x; } }; DSU dsu; int main(void) { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // freopen("REPAIR.INP", "r", stdin); // freopen("REPAIR.OUT", "w", stdout); cin >> n >> m >> q; for (int i = 1; i <= m; ++i) { cin >> e[i].u >> e[i].v; if (e[i].u > e[i].v) swap(e[i].u, e[i].v); S.insert({e[i].u, e[i].v}); } for (int i = 1; i <= q; ++i) { cin >> Q[i].u >> Q[i].v; if (Q[i].u > Q[i].v) swap(Q[i].u, Q[i].v); auto it = S.find({Q[i].u, Q[i].v}); if (it != S.end()) S.erase(it); } dsu.init(n); for (int i = 1; i <= n; ++i) ans[i] = 0; for (auto p : S) dsu.unite(p.first, p.second, -1); for (int i = q; i >= 1; --i) dsu.unite(Q[i].u, Q[i].v, i); for (int i = 2; i <= n; ++i) cout << ans[i] << "\n"; }