#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for(int i=0;i<(int)(n);i++) #define RREP(i,n) for(int i=n-1;i>=0;i--) #define FOR(i,k,n) for(int i=(k);i<(int)(n);i++) #define all(i,n) (i),(i+n) int dx4[4]={1,0,-1,0}; int dy4[4]={0,-1,0,1}; int dx8[8]={1,0,-1,1,-1,1,0,-1}; int dy8[8]={1,1,1,0,0,-1,-1,-1}; typedef pair P; typedef pair SP; typedef long long ll; typedef pair PLL; const int INF = 1e9; const ll LLINF = 1e18; const int MAX_V = 1e6+1; const ll mod = 1000000007; // -------------------------------------- class UnionFind { public: vector data; vector edge; UnionFind(int size) : data(size, -1), edge(size, 0) {}; int find(int x) { return data[x] < 0 ? x : data[x] = find(data[x]); } void unite(int x, int y) { x = find(x); y = find(y); if(x != y) { if(data[y] < data[x]) swap(x, y); data[x] += data[y]; data[y] = x; edge[x] += edge[y] + 1; } else { edge[x] += 1; } } int size(int x) { return -data[find(x)]; } }; int n; int edge_count[100005]; bool check() { bool f = true; REP(i, n) { if(edge_count[i] != 0 && edge_count[i] != 2) f = false; } return f; } int main() { cin.tie(0); ios::sync_with_stdio(false); cin >> n; UnionFind uf(n); REP(i, n - 1) { int a, b; cin >> a >> b; edge_count[a]++; edge_count[b]++; uf.unite(a, b); } cout << (uf.size(0) == n || (uf.size(0) == n - 1 && check()) ? "Bob" : "Alice") << endl; }