#include <bits/stdc++.h>
using namespace std;
long long pwr(long long base, long long p, long long mod = (1000000007LL)) {
  long long ans = 1;
  while (p) {
    if (p & 1) ans = (ans * base) % mod;
    base = (base * base) % mod;
    p /= 2;
  }
  return ans;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
int n, root, deg[200005], pathlen[200005];
set<int> adj[200005];
map<int, int> paths[200005];
void dfs(int v) {
  if (adj[v].empty()) {
    pathlen[v] = 0;
    return;
  }
  for (auto vv : adj[v]) adj[vv].erase(v);
  for (auto vv : adj[v]) {
    dfs(vv);
    if ((int)paths[vv].size() > 1) {
      printf("-1\n");
      exit(0);
    }
    paths[v][pathlen[vv]] = vv;
  }
  for (auto it : paths[v]) pathlen[v] = 1 + it.first;
}
int maxlevel, level[200005];
int get_centre_of_tree() {
  queue<int> qq;
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) qq.push(i);
  while (!qq.empty()) {
    int v = qq.front();
    qq.pop();
    for (auto vv : adj[v]) {
      deg[vv]--;
      if (deg[vv] == 1) {
        level[vv] = level[v] + 1;
        maxlevel = max(maxlevel, level[vv]);
        qq.push(vv);
      }
    }
  }
  for (int i = 1; i <= n; i++)
    if (level[i] == maxlevel) return i;
  return 0;
}
int main() {
  scanf("%d", &n);
  if (n == 1) {
    printf("0\n");
    return 0;
  }
  if (n == 2 || n == 3) {
    printf("1\n");
    return 0;
  }
  int e = n - 1;
  while (e--) {
    int a, b;
    scanf("%d%d", &a, &b);
    deg[a]++;
    deg[b]++;
    adj[a].insert(b);
    adj[b].insert(a);
    if (deg[a] > 2) root = a;
    if (deg[b] > 2) root = b;
  }
  if (root == 0) {
    int len = n - 1;
    while (len > 0 && len % 2 == 0) len /= 2;
    printf("%d\n", len);
    return 0;
  }
  root = get_centre_of_tree();
  dfs(root);
  if (paths[root].size() > 2) {
    printf("-1\n");
    return 0;
  }
  int len = 0;
  for (auto x : paths[root]) len += x.first + 1;
  while (len > 0 && len % 2 == 0) len /= 2;
  printf("%d\n", len);
  return 0;
}
