//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#pragma GCC optimize("Ofast,unroll-loops")
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <iomanip>
#include <numeric>
#include <algorithm>
#include <random>
using ll = long long;
#define int ll
#define all(a) a.begin(), a.end()

using namespace std;
//using namespace __gnu_pbds;

//using odered_set = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;
mt19937 rnd(0);

int n, m, group;
vector<int> par;

int find(int v) {
	return par[v] == v ? v : par[v] = find(par[v]);
}

void unite(int u, int v) {
	u = find(u);
	v = find(v);
	par[u] = v;
}

vector<int> e, used;

void dfs(vector<vector<int>>& g, int v) {
	used[v] = 1;
	for (auto to : g[v]) {
		if (!used[to]) {
			dfs(g, to);
		}
	}
	e.push_back(v);
}

void dfs1(vector<vector<int>>& g, int v, int t) {
	used[v] = t;
	for (auto to : g[v]) {
		if (!used[to]) {
			dfs1(g, to, t);
		}
	}
}

vector<int> css(vector<pair<int, int>> edg) {
	vector<vector<int>> g(n);
	for (auto [u, v] : edg) {
		g[u].push_back(v);
	}
	e.clear();
	used.assign(n, 0);
	for (int i = 0; i < n; i++) {
		if (!used[i]) {
			dfs(g, i);
		}
	}
	vector<vector<int>> gr(n);
	for (int i = 0; i < n; i++) {
		for (auto to : g[i]) {
			gr[to].push_back(i);
		}
	}
	reverse(all(e));
	used.assign(n, 0);
	int t = 1;
	for (auto v : e) {
		if (!used[v]) {
			dfs1(gr, v, t);
			t++;
		}
	}
	return used;
}

vector<int> norm(vector<int> v) {
	map<int, int> mem;
	for (auto& i : v) {
		if (mem.find(i) == mem.end()) {
			mem[i] = mem.size();
		}
		i = mem[i];
	}
	return v;
}

void solve() {
	cin >> n >> m >> group; 
	cout << m - n << ' ' << 0;
}

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
#ifdef LOCAL
	auto f1 = freopen("input.txt", "r", stdin);
	auto f2 = freopen("output.txt", "w", stdout);
#endif

	int t;
	t = 1;// cin >> t;
	while (t--) {
		solve();
	}
}