#include <iostream>
#include <iomanip>
#include <cmath>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main()
{
	double c1x = 0, c1y = 0, c1r = 0, c2x = 0, c2y = 0, c2r = 0,
   		   d = 0, a = 0, b = 0, s = 0, t = 0, u = 0;
	int k = 0;
	vector<pair<double, double>> v(4);

	cin >> c1x >> c1y >> c1r >> c2x >> c2y >> c2r;

	d = sqrt(pow(c1x - c2x, 2) + pow(c1y - c2y, 2));

	if (c1y == c2y) {
		v[0].first = c1x + c1r * (c1r - c2r) / (c2x - c1x);
		v[1].first = v[0].first;
		v[0].second = c1y - sqrt(c1r * c1r - pow(v[0].first - c1x, 2));
		v[1].second = c1y + sqrt(c1r * c1r - pow(v[0].first - c1x, 2));
		v[2].first = c1x + c1r * (c1r + c2r) / (c2x - c1x);
		v[3].first = v[2].first;
		v[2].second = c1y - sqrt(c1r * c1r - pow(v[2].first - c1x, 2));
		v[3].second = c1y + sqrt(c1r * c1r - pow(v[2].first - c1x, 2));
	}
	else {
		a = -(c2x - c1x) / (c2y - c1y);
		b = (c1x * (c2x - c1x) + c1r * (c1r - c2r)) / (c2y - c1y) + c1y;

		s = 1 + a * a;
		t = c1x - a * (b - c1y);
		u = c1x * c1x + (b - c1y) * (b - c1y) - c1r * c1r;

		v[0].first = (t - sqrt(t * t - s * u)) / s;
		v[1].first = (t + sqrt(t * t - s * u)) / s;
		v[0].second = a * v[0].first + b;
		v[1].second = a * v[1].first + b;

		b = (c1x * (c2x - c1x) + c1r * (c1r + c2r)) / (c2y - c1y) + c1y;

		s = 1 + a * a;
		t = c1x - a * (b - c1y);
		u = c1x * c1x + (b - c1y) * (b - c1y) - c1r * c1r;

		v[2].first = (t - sqrt(t * t - s * u)) / s;
		v[3].first = (t + sqrt(t * t - s * u)) / s;
		v[2].second = a * v[2].first + b;
		v[3].second = a * v[3].first + b;
	}

	if (d == abs(c1r - c2r))
		k = 1;
	else if (d > abs(c1r - c2r) && d < c1r + c2r)
		k = 2;
	else if (d == c1r + c2r)
		k = 3;
	else if (d > c1r + c2r)
		k = 4;

	sort(v.begin(), v.begin() + k);

	for (int i = 0; i < k; i++) {
		cout << setiosflags(ios::showpoint | ios::fixed) << setprecision(10)
			<< v[i].first << " " << v[i].second << endl;
	}

	return 0;
}
