#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <math.h>
#include <stdbool.h>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

class Point {
    public:
    double x, y;

    Point(double x = 0, double y = 0): x(x), y(y) {}

    Point operator + (Point p) { return Point(x+p.x, y+p.y); }
    Point operator - (Point p) { return Point(x-p.x, y-p.y); }
    Point operator * (double a) { return Point(a*x, a*y); }
    Point operator / (double a) { return Point(x/a, y/a); }

    double abs() {return sqrt(norm()); }
    double norm() {return x*x + y*y; }
    Point rot(int i) {
        i %= 4;
        Point rVec;
        if ( i==0 ) return Point(x, y);
        if ( i==1 ) return Point(-y, x);
        if ( i==2 ) return Point(-x, y);
        if ( i==3 ) return Point(y, -x);
        return Point(0,0);
    }
};

typedef Point Vector;

class Circle {
    public:
    double r;
    Point c;

    Circle(double r = 0, Point c = Point()): r(r) {}
};


void getOuterTangent(vector<Point>& tangentPoints, bool isSwap, Point c1, double r1, Point c2, double r2);
void getMiddleTangent(vector<Point>& tangentPoints, bool isSwap, Point c1, double r1, Point c2, double r2);
void getInnerTangent(vector<Point>& tangentPoints, bool isSwap, Point c1, double r1, Point c2, double r2);
bool myComp(Point p0, Point p1);
void print(vector<Point>& tangentPoints);

int main(){
    #if 0
    std::ifstream in("input.txt");
    std::cin.rdbuf(in.rdbuf());
    #endif

    Point c1, c2;
    double r1, r2;
    cin >> c1.x >> c1.y >> r1;
    cin >> c2.x >> c2.y >> r2;

    bool isSwap = false;
    if ( r1 < r2 ) {
        isSwap = true;
        swap(r1, r2);
        swap(c1.x, c2.x);
        swap(c1.y, c2.y);
    }

    vector<Point> tangentPoints;
    double d = ( c1 - c2 ).abs();

    if ( d > r1 + r2 ){
        getOuterTangent(tangentPoints, isSwap, c1, r1, c2, r2);
        getInnerTangent(tangentPoints, isSwap, c1, r1, c2, r2);
    }
    else if ( d == r1 + r2 ){
        getOuterTangent(tangentPoints, isSwap, c1, r1, c2, r2);
        getMiddleTangent(tangentPoints, isSwap, c1, r1, c2, r2);
    }
    else if ( d  > r1 - r2 ){
        getOuterTangent(tangentPoints, isSwap, c1, r1, c2, r2);
    }
    else if ( d == r1 - r2 ){
        getMiddleTangent(tangentPoints, isSwap, c1, r1, c2, r2);
    }

    if ( d >= r1 - r2 ) print(tangentPoints);
    return 0;
}

void getOuterTangent(vector<Point>& tangentPoints, bool isSwap, Point c1, double r1, Point c2, double r2) {
    double d = ( c2 - c1 ).abs();
    Vector eVec = ( c2 - c1 ) / d;
    Vector rVec = eVec.rot(1);
    double s1, h1, s2, h2;
    s1 = r1 * (r1 - r2) / d;
    h1 = sqrt( r1*r1 - s1*s1 );
    s2 = r2 * (r1 - r2) / d;
    h2 = sqrt( r2*r2 - s2*s2 );

    if (isSwap) {
        swap(s1, s2);
        swap(h1, h2);
        swap(c1.x, c2.x);
        swap(c1.y, c2.y);
    }

    tangentPoints.push_back( c1 + eVec * s1 + rVec * h1 );
    tangentPoints.push_back( c1 + eVec * s1 - rVec * h1 );
}

void getMiddleTangent(vector<Point>& tangentPoints, bool isSwap, Point c1, double r1, Point c2, double r2) {
    double d = ( c2 - c1 ).abs();
    Vector eVec = ( c2 - c1 ) / d;
    tangentPoints.push_back( c1 + eVec * r1 );
}

void getInnerTangent(vector<Point>& tangentPoints, bool isSwap, Point c1, double r1, Point c2, double r2) {
    double d = ( c2 - c1 ).abs();
    Vector eVec = ( c2 - c1 ) / d;
    Vector rVec = eVec.rot(1);
    double s1, h1, s2, h2;
    s1 = r1 * (r1 + r2) / d;
    h1 = sqrt( r1*r1 - s1*s1 );
    s2 = r2 * (r1 + r2) / d;
    h2 = sqrt( r2*r2 - s2*s2 );

    if (isSwap) {
        swap(s1, s2);
        swap(h1, h2);
        swap(c1.x, c2.x);
        swap(c1.y, c2.y);
        eVec = eVec * (-1);
    }

    tangentPoints.push_back( c1 + eVec * s1 + rVec * h1 );
    tangentPoints.push_back( c1 + eVec * s1 - rVec * h1 );
}

bool myComp(Point p0, Point p1) {
    return ( p0.x < p1.x ) || ( ( p0.x == p1.x ) && ( p0.y < p1.y ) );
}

void print(vector<Point>& tangentPoints) {
    int n = tangentPoints.size();
    sort(tangentPoints.begin(), tangentPoints.end(), *myComp);
    for (int i=0; i<n; i++) {
        cout << fixed << setprecision(11) << tangentPoints[i].x << " " << tangentPoints[i].y << endl;
    }
}



Measured memory_bytes: 3284