Problem: Find the tangent lines between a point $p$ and a circle $c$.

Constraints

* $-1,000 \leq px, py, cx, cy \leq 1,000$
* $1 \leq r \leq 1,000$
* Distance between $p$ and the center of $c$ is greater than the radius of $c$.

Input

The input is given in the following format.

$px \; py$
$cx \; cy \; r$

$px$ and $py$ represents the coordinate of the point $p$. $cx$, $cy$ and $r$ represents the center coordinate and radius of the circle $c$ respectively. All input values are given in integers.

Output

Print coordinates of the tangent points on the circle $c$ based on the following rules.

* Print the coordinate with smaller $x$ first. In case of a tie, print the coordinate with smaller $y$ first.



The output values should be in a decimal fraction with an error less than 0.00001.

Examples

Input

0 0
2 2 2


Output

0.0000000000 2.0000000000
2.0000000000 0.0000000000


Input

-3 0
2 2 2


Output

0.6206896552 3.4482758621
2.0000000000 0.0000000000

Solution (in CPP):

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

const int MAXN = 50000 + 10;
const double pi = acos(-1.0);
const double inf = 1e100;
const double eps = 1e-12;

typedef struct point vec;  //向量vec
struct point {    //点的基本数据结构
    double x, y;
    point(double _x=0, double _y=0):
    x(_x),y(_y)
    {
    }
    point operator*(const point& i_T) const
    {
        return point(x * i_T.x, y * i_T.y);
    }
    point operator*(double u) const
    {
        return point(x * u, y * u);
    }
    bool operator==(const point& i_T) const
    {
        return x == i_T.x && y == i_T.y;
    }
    point operator/(double u) const
    {
        return point(x / u, y / u);
    }
    point operator+(const point& i_T)
    {
        return point(x + i_T.x, y + i_T.y);
    }
    point operator-(const point& i_T)
    {
        return point(x - i_T.x, y - i_T.y);
    }
    friend bool operator<(point a, point b)
    {
        return a.y == b.y ? a.x < b.x : a.y < b.y;
    }
    friend ostream& operator<<(ostream& out, point& a)
    {
        //cout << a.x << ' ' << a.y;
        printf("%.8f %.8f", a.x+eps, a.y+eps);
        return out;
    }
    friend istream& operator>>(istream& in, point& a)
    {
        in >> a.x >> a.y;
        return in;
    }
};
struct cirles {
    vec o;
    double r;
    friend istream& operator>>(istream& in, cirles& a)
    {
        in >> a.o >> a.r;
        return in;
    }
    friend ostream& operator<<(ostream& out, cirles& a)
    {
        out << a.o << ' ' << a.r;
        return out;
    }
};
double changdu(vec a) //向量长度
{
    return sqrt(a.x * a.x + a.y * a.y);
}
vec xiangliang_xuanzhuan(vec a,double pi) //将向量按照起点旋转逆时针pi,
{
    double x,y;
    x=cos(pi)*a.x-sin(pi)*a.y; 
    y=sin(pi)*a.x+cos(pi)*a.y;
    return vec(x,y);
}
pair<point,point>guodian_yuan_qiedian(cirles a,point p)
{
    double l=changdu(a.o-p);
    double t=asin(a.r/l);
    double lb=l*cos(t);
    vec x=a.o-p;
    x=x/l*lb;
    return make_pair(p+xiangliang_xuanzhuan(x,t),p+xiangliang_xuanzhuan(x,-t));
}
int dayu_dengyu(double x, double y)
{
    if (fabs(x - y) < eps || x > y)
        return 1;
    return 0;
}
int main()
{
    //freopen("txt.txt", "w", stdout);
    cirles a;
    point p;
    cin>>p>>a;
    pair<point,point>q=guodian_yuan_qiedian(a,p);
    if (fabs(q.first.x - q.second.x) < eps) {
        if (dayu_dengyu(q.first.y, q.second.y))
            cout << q.second << '\n' << q.first << endl;
        else
            cout << q.first << '\n' << q.second << endl;
    } else if (dayu_dengyu(q.first.x, q.second.x))
        cout << q.second << '\n' << q.first << endl;
    else
        cout << q.first << '\n' << q.second << endl;
    return 0;
}