#include <bits/stdc++.h>
#define int long long

#define fi first
#define se second
#define endl '\n'
#define lb long double

#define vi std::vector<int>
#define isz(v) (int) v.size()
#define pii std::pair<int, int>
#define all(v) v.begin(), v.end()
#define vii vector<pair<int, int>>

#define loop cerr << "here" << endl;
#define TIME 1.0 * clock() / CLOCKS_PER_SEC

using namespace std;
typedef long long ll;

const int MAXN = 2e5 + 7;
const int inf32 = 1e15;

template <typename T> void maximize(T &a, T b){if(a < b) a = b;}
template <typename T> void minimize(T &a, T b){if(a > b) a = b;}

stack<int> st;
int dfstimer, id[MAXN], low[MAXN], n, sccCnt, scc[MAXN], sz[MAXN];
vi a[MAXN];
bool articulation_point[MAXN];
vii edge;

void dfsTarjan(int u, int p){
    id[u] = low[u] = ++dfstimer;
    st.push(u);
    int cnt = (u != 1);

    for(auto v : a[u]){
        if(v == p) continue;
        if(id[v]){
            minimize(low[u], id[v]);
        }

        else{
            dfsTarjan(v, u);
            minimize(low[u], low[v]);
            if(low[v] >= id[u]) cnt++;
        }

    }


    if(low[u] == id[u]){
        int v;
        sccCnt++;

        do{
            sz[sccCnt]++;
            v = st.top();
            st.pop();
            scc[v] = sccCnt;

        }while(v != u);
    }

}

bool check(int u, int v){
    if(sz[scc[u]] > 1){
        if(scc[u] == scc[v] and (isz(a[u]) > 2 or isz(a[v]) > 2)){
            return 1;
        }
        else if(scc[u] != scc[v] and (isz(a[u]) > 3 or isz(a[v]) > 1)){
                return 1;
        }
        return 0;
    }
    if(isz(a[u]) == 1){
        if(sz[scc[v]] > 1 and isz(a[v]) > 3) return 1;
        else if(sz[scc[v]] == 1 and isz(a[v]) > 2) return 1;
    }
    else{
        return isz(a[u]) > 1 and isz(a[v]) > 1 ;
    }
    return 0;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    #define task "bai3"
    if (fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }

    cin >> n;
    for(int i = 1; i <= n; i++){
        int x, y;
        cin >> x >> y;
        a[x].push_back(y);
        a[y].push_back(x);
        edge.push_back({x, y});
    }

    dfsTarjan(1, -1);

    int ans = 0;
    for(auto i : edge){
        int u = i.fi, v = i.se;
        ans += check(u, v) | check(v, u);
    }

    cout << ans;
}
