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

#include <bits/stdc++.h>
using namespace std;
const int MaxN = 2e5;
vector<int> g[MaxN];
int step[MaxN];
bool can[MaxN];
int down[MaxN];
bool used[MaxN];
int root = -1;
void dfs(int v) {
  used[v] = true;
  int max_d = -1e9;
  int min_d = 1e9;
  bool ok = true;
  for (int i = 0; i < g[v].size(); ++i) {
    int to = g[v][i];
    if (!used[to]) {
      dfs(to);
      max_d = max(max_d, down[to]);
      min_d = min(min_d, down[to]);
      ok = ok && can[to];
    }
  }
  if (g[v].size() == 1) {
    can[v] = true;
    down[v] = 0;
  } else {
    if (min_d == max_d && ok) {
      can[v] = true;
      down[v] = min_d + 1;
    }
  }
}
bool used2[MaxN];
int dist[MaxN];
int par[MaxN];
void dfs2(int v, int d = 0) {
  used2[v] = true;
  dist[v] = d;
  for (int i = 0; i < g[v].size(); ++i) {
    int to = g[v][i];
    if (!used2[to]) {
      dfs2(to, d + 1);
    }
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n - 1; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--, y--;
    g[x].push_back(y);
    g[y].push_back(x);
    step[x]++;
    step[y]++;
  }
  if (n == 2) {
    cout << 1 << endl;
    return 0;
  }
  bool ok = true;
  for (int i = 0; i < n; ++i)
    if (step[i] > 2) {
      root = i;
      ok = false;
      break;
    }
  if (ok) {
    int edges = n - 1;
    while (edges % 2 == 0) edges /= 2;
    cout << edges << endl;
    return 0;
  }
  dfs2(0);
  int mx = 0;
  for (int i = 0; i < n; ++i)
    if (dist[i] > dist[mx]) {
      mx = i;
    }
  for (int i = 0; i < n; ++i) {
    used2[i] = false;
    dist[i] = 0;
  }
  dfs2(mx);
  int mx2 = 0;
  for (int i = 0; i < n; ++i)
    if (dist[i] > dist[mx2]) {
      mx2 = i;
    }
  for (int i = 0; i < n; ++i) {
    used2[i] = false;
    dist[i] = 0;
  }
  dfs2(mx2);
  int mx3 = 0;
  for (int i = 0; i < n; ++i)
    if (dist[i] > dist[mx3]) {
      mx3 = i;
    }
  int QQ = dist[mx3];
  for (int i = 0; i < n; ++i) {
    if (dist[i] == QQ / 2) {
      root = i;
      break;
    }
  }
  if (n > 100) cout << root << endl;
  dfs(root);
  if (can[root]) {
    if (n > 100) cout << "CAN" << endl;
    int ans = down[root];
    while (ans % 2 == 0) ans /= 2;
    cout << ans << endl;
  } else {
    if (n > 100) cout << "CANT" << endl;
    vector<int> depthes;
    set<int> vv;
    for (int i = 0; i < g[root].size(); ++i) {
      int to = g[root][i];
      if (!can[to]) {
        if (n > 100) cout << "OOPS" << endl;
        cout << -1 << endl;
        return 0;
      } else {
        depthes.push_back(down[to] + 1);
        vv.insert(down[to] + 1);
      }
    }
    if (n > 100) cout << "OOPS part 2" << endl;
    if (vv.size() > 2) {
      cout << -1 << endl;
      return 0;
    }
    sort(depthes.begin(), depthes.end());
    int total = depthes[0] + depthes.back();
    while (total % 2 == 0) {
      total /= 2;
    }
    cout << total << endl;
  }
}
