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 = 200005;
struct info {
  bool legal, l_2;
  int lis[3], cnt;
  void merge(const info &b) {
    static int cur[6];
    int tot = cnt;
    for (int i = 0; i < cnt; i++) cur[i] = lis[i];
    for (int i = 0; i < b.cnt; i++) cur[tot++] = b.lis[i];
    sort(cur, cur + tot);
    for (; tot > 1 && cur[tot - 1] == cur[tot - 2]; tot--)
      ;
    if (tot < 4) {
      cnt = tot;
      for (int i = 0; i < tot; i++) lis[i] = cur[i];
    } else {
      cnt = 3;
      for (int i = tot - 3; i < tot; i++) lis[i - (tot - 3)] = cur[i];
    }
    if (cnt > 1) legal = 0;
    l_2 &= b.legal;
    if (!l_2) legal = 0;
  }
  void init() {
    cnt = 0;
    legal = l_2 = 1;
  }
  void init(int d) {
    lis[cnt++] = d;
    legal = l_2 = 1;
  }
  void add() {
    for (int i = 0; i < cnt; i++) lis[i]++;
  }
};
vector<int> lk[maxn];
info sub[maxn];
int n, ans;
void link(int u, int v) { lk[u].push_back(v); }
void dfs(int now, int pre) {
  bool lf = 1;
  sub[now].init();
  for (int i = 0; i < lk[now].size(); i++)
    if (lk[now][i] != pre) {
      lf = 0;
      dfs(lk[now][i], now);
      info tmp = sub[lk[now][i]];
      tmp.add();
      sub[now].merge(tmp);
    }
  if (lf) sub[now].init(0);
}
info other[maxn];
void trans(int now, int pre, info out) {
  info tmp;
  tmp.init();
  if (lk[now].size() == 1) tmp.init(0);
  for (int i = 0; i < lk[now].size(); i++)
    if (lk[now][i] != pre) {
      other[lk[now][i]] = tmp;
      info bak = sub[lk[now][i]];
      bak.add();
      tmp.merge(bak);
    }
  tmp.init();
  for (int i = lk[now].size() - 1; i >= 0; i--)
    if (lk[now][i] != pre) {
      int v = lk[now][i];
      other[v].merge(tmp);
      other[v].merge(out);
      other[v].add();
      trans(v, now, other[v]);
      info bak = sub[lk[now][i]];
      bak.add();
      tmp.merge(bak);
    }
  info cur = sub[now];
  cur.merge(out);
  if (cur.l_2 && cur.cnt < 3) {
    if (cur.cnt == 1)
      ans = min(ans, cur.lis[0]);
    else
      ans = min(ans, cur.lis[cur.cnt - 1] + cur.lis[cur.cnt - 2]);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d%d", &u, &v);
    link(u, v), link(v, u);
  }
  info fi;
  fi.init();
  dfs(1, 0);
  ans = (1 << 30);
  trans(1, 0, fi);
  if (ans == (1 << 30))
    printf("-1\n");
  else
    printf("%d\n", ans);
  return 0;
}
