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

struct point{
    double x,y;
    point(double A,double B){
        x=A,y=B;
    }
    point() = default;
};

struct line{
    point point_A,point_B;
    line(point A,point B){
        point_A = A,point_B = B;
    }
    line() = default;
};

struct Circle{
    point O;
    int r;
    Circle(point A,int B){
        O=A,r=B;
    }
    Circle() = default;
};

double getDistance(const Circle& circle, const line& l) {
    // 请在这里实现你的代码
  //本题考察勾股定理结合点到直线距离,思维难度初中水平,难点依旧在如何访问和使用结构体中的数据
  
  //先判断特例,即直线垂直于x轴的情况
    if(l.point_A.x==l.point_B.x)
    {
        double dis=fabs(circle.O.x-l.point_A.x);
        double ret=fabs(sqrt(circle.r*circle.r-dis*dis))*2;
        return ret;
    }
  
  //再判断另一个特例,即A、B重合,此时弦长为0
    if(l.point_A.x==l.point_B.x&&l.point_A.y==l.point_B.y)
    return 0.0;
  
  //一般情况,套用点到直线距离公式,配合勾股定理求解即可,点到直线距离的讲解在我其他题解有详细解析
    double k=(l.point_A.y-l.point_B.y)/(l.point_A.x-l.point_B.x);
    double deno=sqrt(fabs(1+k*k));
    double dist=fabs(k*circle.O.x-circle.O.y-k*l.point_A.x+l.point_A.y)/deno;
    double ret=fabs(sqrt(circle.r*circle.r-dist*dist))*2;
    return ret;
}





















































































































































































int main() {
    double ox, oy, r;
    double x1, y1, x2, y2;
    
    cin >> ox >> oy >> r;
    cin >> x1 >> y1 >> x2 >> y2;
    
    point center(ox, oy);
    Circle circle(center, (int)r);
    
    point p1(x1, y1);
    point p2(x2, y2);
    line l(p1, p2);
    
    double result = getDistance(circle, l);
    cout << fixed << setprecision(6) << result << endl;
    
    return 0;
}