#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;
};

point findMeetingPoint(line line_A, line line_B) {
    point p;
    double xa = line_A.point_A.x, ya = line_A.point_A.y;
    double xb = line_A.point_B.x, yb = line_A.point_B.y;
    double xc = line_B.point_A.x, yc = line_B.point_A.y;
    double xd = line_B.point_B.x, yd = line_B.point_B.y;
    if (fabs((yc - yd) * (xa - xb) - (xc - xd) * (ya - yb)) < 1e-10) {
        // 检查是否重合
        // 如果AB上的点A到直线CD的距离为0,且CD上的点C到直线AB的距离为0,则重合
        double distAtoCD = fabs((xd - xc) * (ya - yc) - (xa - xc) * (yd - yc));
        double distCtoAB = fabs((xb - xa) * (yc - ya) - (xc - xa) * (yb - ya));

        if (distAtoCD < 1e-10 && distCtoAB < 1e-10) {
            // 两直线重合,交点不唯一
            return point(-1, -1);
        } else {
            // 两直线平行但不重合,无交点
            // 题目要求:若两直线交点不唯一,则返回点(-1, -1)
            // 平行且不重合时,交点不存在,但根据题目要求返回(-1, -1)
            return point(-1, -1);
        }
    }
    double x0 = ((xc - xd) * (xb * ya - xa * yb) - (xa - xb) *
                 (xd * yc - xc * yd)) / (-(yc - yd) * (xa - xb) + (xc - xd) * (ya - yb));
    double y0 = ((xa * yb - ya * xb) * (yc - yd) - (ya - yb) *
                 (xc * yd - yc * xd)) / ((yc - yd) * (xa - xb) - (xc - xd) * (ya - yb));

    p.x = x0, p.y = y0;
    return p;
}
int main() {
    point A, B, C, D;
    cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y >> D.x >> D.y;
    line AB = line(A, B);
    line CD = line(C, D);
    point ans = findMeetingPoint(AB, CD);
    cout << fixed << setprecision(6);
    cout << ans.x << " " << ans.y;
    return 0;
}