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 N = 200010;
int ans, head[N], a[N], c[N], dep[N], dd[N];
bool v[N], T[N], b[N], s1[N], s2[N], s3[N], s4[N], ok[N];
struct edge {
  int to, next;
} e[2 * N];
void push(int k, int first, int second) {
  e[k].to = second;
  e[k].next = head[first];
  head[first] = k;
}
void dfs1(int k) {
  v[k] = 1;
  int p = head[k], w = -1;
  dep[k] = 0;
  ok[k] = 1;
  while (p) {
    if (!v[e[p].to]) {
      dfs1(e[p].to);
      ok[k] &= ok[e[p].to];
      if (w != -1 && dep[e[p].to] != w) ok[k] = 0;
      w = dep[e[p].to];
      dep[k] = max(dep[k], dep[e[p].to] + 1);
    }
    p = e[p].next;
  }
}
int h(int first) {
  while (first % 2 == 0) first /= 2;
  return first;
}
void dfs2(int k, int d) {
  int cnt = 0, p = head[k];
  bool t = 1;
  while (p) {
    if (!v[e[p].to]) {
      a[++cnt] = dep[e[p].to] + 1;
      t &= ok[e[p].to];
    }
    p = e[p].next;
  }
  if (k != 1) a[++cnt] = d;
  sort(a + 1, a + cnt + 1);
  if (t) {
    if (a[1] == a[cnt])
      ans = min(ans, h(a[1]));
    else {
      int s = 0;
      for (int i = 1; i < cnt; i++)
        if (a[i] != a[i + 1]) s++;
      if (s < 2) ans = min(ans, h(a[1] + a[cnt]));
    }
  }
  v[k] = 1;
  p = head[k];
  cnt = 0;
  while (p) {
    if (!v[e[p].to]) {
      a[++cnt] = dep[e[p].to];
      b[cnt] = ok[e[p].to];
      c[cnt] = e[p].to;
    }
    p = e[p].next;
  }
  s1[1] = s1[0] = 1;
  for (int i = 2; i <= cnt; i++) s1[i] = s1[i - 1] & (a[i] == a[i - 1]);
  s2[cnt] = s2[cnt + 1] = 1;
  for (int i = cnt - 1; i > 0; i--) s2[i] = s2[i + 1] & (a[i] == a[i + 1]);
  s3[0] = 1;
  for (int i = 1; i <= cnt; i++) s3[i] = s3[i - 1] & b[i];
  s4[cnt + 1] = 1;
  for (int i = cnt; i > 0; i--) s4[i] = s4[i + 1] & b[i];
  for (int i = 1; i <= cnt; i++)
    if (s1[i - 1] && s2[i + 1] && s3[i - 1] && s4[i + 1]) {
      if (i >= 2 && i + 1 <= cnt && a[i - 1] != a[i + 1]) continue;
      if (k > 1 && i >= 2 && a[i - 1] + 1 != d) continue;
      if (k > 1 && i + 1 <= cnt && a[i + 1] + 1 != d) continue;
      T[c[i]] = 1;
      dd[c[i]] = d + 1;
      if (k == 1) {
        if (i > 1) dd[c[i]] = a[i - 1] + 2;
        if (i + 1 <= cnt) dd[c[i]] = a[i + 1] + 2;
      }
    }
  p = head[k];
  while (p) {
    if ((!v[e[p].to]) && T[e[p].to]) dfs2(e[p].to, dd[e[p].to]);
    p = e[p].next;
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int first, second;
    scanf("%d%d", &first, &second);
    push(2 * i - 1, first, second);
    push(2 * i, second, first);
  }
  memset(v, 0, sizeof(v));
  dfs1(1);
  ans = n + 1;
  memset(v, 0, sizeof(v));
  memset(T, 0, sizeof(T));
  dfs2(1, 0);
  if (ans <= n)
    printf("%d\n", ans);
  else
    puts("-1");
  return 0;
}
