/*
TASK:man
LANG:C++
*/
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

vector<int> r[15010];
int s[15010][2];
int vis[15010];
int path(int a, int end)
{
    queue<int> dat;
    dat.push(a);
    int v;
    int i, sz;
    vis[a]=1;
    while(!dat.empty() )
    {
        a=dat.front();
        dat.pop();
        sz=r[a].size();
        if(a==end) return 1;
        for(i=0; i<sz; i++)
        {
            v=r[a][i];
            if(vis[v]) continue;
            dat.push(v);
            vis[v]=1;
        }
    }
    return 0;
}

int i, sz;
vector<int>::iterator vi;
void remove( int a, int b)
{
    for(vi=r[a].begin(); vi!=r[a].end(); vi++)
        if(*vi==b)
        {
            r[a].erase(vi);
            break;
        }
    for(vi=r[b].begin(); vi!=r[b].end(); vi++)
        if(*vi==a)
        {
            r[b].erase(vi);
            break;
        }
}

int qwert[15010];
int main()
{
    int m, n=0;
    int br=0;
    scanf("%d", &m);
    for(int i=0; i<m; i++)
    {
        scanf("%d%d", &s[i][0], &s[i][1]);
        r[ s[i][0] ].push_back(s[i][1]);
        r[ s[i][1] ].push_back(s[i][0]);
        if(qwert[s[i][1]]++==0) n++;
        if(qwert[s[i][0]]++==0) n++;
    }
    int p, q, j;
    for(int i=0; i<m; i++)
    {
        remove(s[i][0], s[i][1]);
        if( path(s[i][0], s[i][1]) )
        {
            br++;
        }
        else
        {
            r[ s[i][0] ].push_back(s[i][1]);
            r[ s[i][1] ].push_back(s[i][0]);
        }
        for(j=0; j<n; j++) vis[j]=0;
    }
    printf("%d\n", m-br);
    return 0;
}
