10
4 2
7 4
2 6
2 5
4 8
10 3
2 9
9 1
5 10
 10
5 10
7 8
8 3
2 6
3 2
9 7
4 5
10 1
6 4
 4
4 1
4 3
4 2
 3
3 1
1 2
 9
1 2
1 3
1 4
1 5
1 6
6 7
6 8
8 9
 5
1 5
2 3
2 4
1 2
 8
6 1
4 7
4 8
8 5
7 6
4 3
4 2
 7
5 6
5 7
5 1
7 4
6 3
3 2
 3
1 3
3 2
 2
1 2
 5
5 4
4 3
3 1
5 2
 6
1 6
3 1
6 4
5 3
2 5
 11
8 9
2 7
1 11
3 2
9 1
8 5
8 6
5 4
4 10
8 3
 11
11 9
6 7
7 1
8 11
5 6
3 5
9 3
10 8
2 4
4 10
 12
12 6
6 7
8 11
4 8
10 4
12 3
2 10
6 2
12 9
4 1
9 5

-1
 9
 1
 1
 3
 3
 -1
 -1
 1
 1
 1
 5
 1
 5
 -1

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>

#define int long long
constexpr static int N = 2e5+9;
constexpr static int M = 1e9+7;
using namespace std;
using pii = pair<int, int>;
#define fastio ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))

#ifdef int
#define INF 0x3f3f3f3f3f3f3f3f
#define INF2 (int)(0xcfcfcfcfcfcfcfcf)
#else
#define INF 0x3f3f3f3f
#define INF2 0xcfcfcfcf
#endif

#define LC (id<<1)
#define RC (id<<1|1)


signed main() {
    fastio;
    int n;
    cin >> n;
    vector<vector<int>> g(n);
    vector<int> d(n, 0);
    for (int i = 0; i < n-1; i++) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        g[u].emplace_back(v);
        g[v].emplace_back(u);
        d[u]++, d[v]++;
    }
    queue<int> q;
    vector<int> tag(n, -1);
    vector<set<int>> link(n);
    for (int i = 0; i < n; i++) {
        if (d[i] == 1) q.emplace(i), tag[i] = 1;
    }
    int last = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        //cout << u << ":" << tag[u] << "\n";
        last = tag[u];
        for (int v: g[u]) {
            if (tag[v] != -1) continue;
            if (SZ(g[v]) == 2) {
                q.emplace(v);
                tag[v] = tag[u] + 1;
            } else {
                d[v]--;
                if (SZ(link[v]) < 3)
                    link[v].emplace(tag[u]);
                if (d[v] <= 1 && SZ(link[v]) == 1) {
                    q.emplace(v);
                    tag[v] = *link[v].begin() + 1;
                }
                if (d[v] == 0 && SZ(link[v]) == 2) {
                    q.emplace(v);
                    tag[v] = accumulate(link[v].begin(), link[v].end(), 0ll) + 1;
                }
            }
        }
    }
    if (*min_element(tag.begin(), tag.end()) < 0) {
        cout << -1 << "\n";
    } else {
        cout << last-1 << "\n";
    }
    return 0;
}