#include<bits/stdc++.h>
using namespace std;

long long n,a[39],b[31];

int main()
{
	cin>>n; 
	a[0]=b[0]=1ll;
	for(int i=1;i<=38;i++)
		a[i]=a[i-1]*3;
	for(int i=1;i<=26;i++)
		b[i]=b[i-1]*5;
//	for(int i=1;i<=30;i++)
//		cout<<a[i]<<endl;
//	for(int i=1;i<=30;i++)
//		cout<<b[i]<<endl;
	for(int i=1;i<=38;i++)
		for(int j=1;j<=26;j++)
			if(a[i]+b[j]==n)
			{
				cout<<i<<' '<<j;
				return 0;
			}
	cout<<-1;
	return 0;
}

#include <iostream>
#include <vector>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <list>
#include <cmath>
#include <algorithm>
#include <assert.h>

using namespace std;

template <typename input_type>
input_type input() {
    input_type inp;
    cin >> inp;

    return inp;
}

const int max_vrtx = 4e5 + 5;

bool cycle, mark[max_vrtx];
int nm, sz;
vector <int> graph[max_vrtx];

void DFS(int vrtx, int par = -1) {
    int useless = 0;
    mark[vrtx] = true;
    sz++;

    for (auto ngh: graph[vrtx]) {
        if (not mark[ngh]) {
            DFS(ngh, vrtx);
        } else if ((ngh != par) or useless) {
            cycle = true;
        } else {
            useless++;
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    nm = input<int>();
    for (int i = 0; i < nm; i++) {
        pair <int, int> color = {input<int>(), input<int>()};

        graph[color.first].push_back(color.second);
        graph[color.second].push_back(color.first);
    }

    int ans = 0;
    for (int i = 0; i < max_vrtx; i++) {
        if ((not mark[i]) and (not graph[i].empty())) {
            DFS(i);
            if (cycle) {
                ans += sz;
            } else {
                ans += (sz - 1);
            }

            sz = 0;
            cycle = false;
        }
    }

    cout << ans;
    return 0;
}