#include<cstdio>
#include<vector>
#include<algorithm>
#include<utility>
#include<numeric>
#include<iostream>
#include<array>
#include<string>
#include<sstream>
#include<stack>
#include<queue>
#include<list>
#include<functional>
#include<set>
#include<complex>
#include<complex>
#define _USE_MATH_DEFINES

#include<math.h>
#include<map>

#define INF 200000000
#define FER 0.0000000001

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<double, double> pdd;

enum
{
	BOTTOM,
	LEFT,
	RIGHT,
	TOP
};

struct P
{
	double x, y;
	P(double x,double y) :x(x), y(y) {}
	P() :P(0, 0) {}
	P operator+(const P& v)const
	{
		return P(x + v.x, y + v.y);
	}
	P operator-(const P& v)const
	{
		return P(x - v.x, y - v.y);
	}
	P operator*(const double v)const
	{
		return P(x*v, y*v);
	}
	bool operator==(const P& v)const
	{
		return abs(x - v.x) <= 0.0000000000001&&abs(y - v.y) <= 0.00000000000001;
	}
	bool operator!=(const P& v)const
	{
		return abs(x - v.x) > 0.0000000000001 || abs(y - v.y) > 0.00000000000001;
	}

	double dot(const P& v)const
	{
		return x*v.x + y*v.y;
	}
	double cross(const P& v)const
	{
		return x*v.y - y*v.x;
	}
	double length()const
	{
		return sqrt(x*x + y*y);
	}
	double length2()const
	{
		return (x*x + y*y);
	}

	P unit()const
	{
		return P(x / length(), y / length());
	}
	
	bool operator<(const P& v)const
	{
		return x<v.x || (x == v.x) && y < v.y;
	}
	bool operator>(const P& v)const
	{
		return x>v.x || (x == v.x) && y > v.y;
	}
};

pair<P,P> cli(double a, double b, double c, double x1, double y1, double r)
{
	double l = a*a + b*b, k = a*x1 + b*y1 + c, d = l*r*r - k*k;
	if (d > 0)
	{
		double ds = sqrt(d), apl = a / l, bpl = b / l, xc = x1 - apl*k, yc = y1 - bpl*k, xd = bpl*ds, yd = apl*ds;
		return make_pair(P(xc - xd, yc + yd), P(xc + xd, yc - yd));
	}
	else
	{
		return make_pair(P(x1 - a*k / l, y1 - b*k / l), P(x1 - a*k / l, y1 - b*k / l));
	}
}

pair<P, P> cci(P p1, P p2, double r1, double r2)
{
	double a = p1.x - p2.x, b = p1.y - p2.y;
	return cli(a, b, 0.5*((r1 - r2)*(r1 + r2) - a*(p1.x + p2.x) - b*(p1.y + p2.y)), p1.x, p1.y, r1);
}

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

	vector<P> points;
	double c1x, c1y, c1r, c2x, c2y, c2r;
	cin >> c1x >> c1y >> c1r >> c2x >> c2y >> c2r;
	
	c2x -= c1x;
	c2y -= c1y;

	double d = sqrt(c2x*c2x + c2y*c2y);

	if (abs(d - c1r - c2r) <= FER)
	{
		points.push_back(P(c1r*(c2x*(c1r + c2r) - c2y*sqrt(c2x*c2x + c2y*c2y - (c1r + c2r)*(c1r + c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r + c2r) + c2x*sqrt(c2x*c2x + c2y*c2y - (c1r + c2r)*(c1r + c2r))) / (c2x*c2x + c2y*c2y) + c1y));
		points.push_back(P(c1r*(c2x*(c1r - c2r) + c2y*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r - c2r) - c2x*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1y));
		points.push_back(P(c1r*(c2x*(c1r - c2r) - c2y*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r - c2r) + c2x*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1y));
	}
	else if (d > (c1r + c2r))
	{
		points.push_back(P(c1r*(c2x*(c1r + c2r) + c2y*sqrt(c2x*c2x + c2y*c2y - (c1r + c2r)*(c1r + c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r + c2r) - c2x*sqrt(c2x*c2x + c2y*c2y - (c1r + c2r)*(c1r + c2r))) / (c2x*c2x + c2y*c2y) + c1y));
		points.push_back(P(c1r*(c2x*(c1r + c2r) - c2y*sqrt(c2x*c2x + c2y*c2y - (c1r + c2r)*(c1r + c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r + c2r) + c2x*sqrt(c2x*c2x + c2y*c2y - (c1r + c2r)*(c1r + c2r))) / (c2x*c2x + c2y*c2y) + c1y));
		points.push_back(P(c1r*(c2x*(c1r - c2r) + c2y*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r - c2r) - c2x*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1y));
		points.push_back(P(c1r*(c2x*(c1r - c2r) - c2y*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r - c2r) + c2x*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1y));
	}
	else
	{
		if (abs(d + min(c1r, c2r) - max(c1r, c2r)) < FER)
		{
			points.push_back(P(c1r*(c2x*(c1r - c2r) - c2y*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r - c2r) + c2x*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1y));
		}
		else if (d + min(c1r, c2r) > max(c1r, c2r))
		{
			points.push_back(P(c1r*(c2x*(c1r - c2r) + c2y*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r - c2r) - c2x*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1y));
			points.push_back(P(c1r*(c2x*(c1r - c2r) - c2y*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1x, c1r*(c2y*(c1r - c2r) + c2x*sqrt(c2x*c2x + c2y*c2y - (c1r - c2r)*(c1r - c2r))) / (c2x*c2x + c2y*c2y) + c1y));
		}
	}

	sort(points.begin(), points.end());

	for (auto& p : points)
	{
		printf("%.10lf %.10lf\n", p.x, p.y);
	}
	
	return 0;
}


Measured memory_bytes: 3328