#include <stdio.h>
#define DICE_EYES 6
#define DICE_TOP 1
#define DICE_FRONT 2
#define DICE_RIGHT 3
#define DICE_LEFT 4
#define DICE_BUCK 5
#define DICE_UNDER 6

/*
サイコロの展開図
.1
4235
.6
*/

// サイコロ用の型を宣言
typedef struct {
    int iDiceNum[DICE_EYES + 1];
} DICE;

// プロトタイプ宣言
int iMatchTop(DICE* pstDice1, DICE* pstDice2);
int iMatchDice(DICE stDice1, DICE stDice2);
void vdRollE(DICE* pstDice);
void vdRollN(DICE* pstDice);
void vdRotationL(DICE* pstDice);

// 展開図から得られるサイコロシミュレーションを行う
int main()
{
    DICE stDice1;    // ダイス1の整数
    DICE stDice2;    // ダイス2の整数
    DICE stDiceTmp;  // ダイスを保持
    int iCount;      // counter
    int iCount2;     // counter2
    // 各面が上になったときのサイコロの目
    int iDicePettern[DICE_EYES][DICE_EYES + 1] = {
        {0, 1, 2, 3, 4, 5, 6},
        {0, 2, 1, 4, 3, 6, 5},
        {0, 3, 1, 2, 5, 6, 4},
        {0, 4, 1, 5, 2, 6, 4},
        {0, 5, 1, 3, 4, 6, 2},
        {0, 6, 2, 4, 3, 5, 1}
    };

    // In: ダイスにかかれた整数
    for (iCount = 1; iCount <= DICE_EYES; iCount++)
    {
        scanf("%d", &stDice1.iDiceNum[iCount]);
    }
    for (iCount = 1; iCount <= DICE_EYES; iCount++)
    {
        scanf("%d", &stDice2.iDiceNum[iCount]);
    }

    // ダイス1の上面を1～6に変えながらダイス2を転がし、一致しているかを調べる
    for (iCount = 0; iCount < DICE_EYES; iCount++)
    {
        // ダイス1をiDicePettern[iCount]と一致させる
        stDiceTmp = stDice1;
        for (iCount2 = 1; iCount2 <= DICE_EYES; iCount2++)
        {
            stDice1.iDiceNum[iCount2] = stDiceTmp.iDiceNum[iDicePettern[iCount][iCount2]];
        }

        // ダイス2を上面が一致するまで転がす
        // 上面が一致したらほかの面も一致しているか判定
        if (iMatchTop(&stDice1, &stDice2))
        {
            // 一致したら終了
            if (iMatchDice(stDice1, stDice2))
            {
                printf("Yes\n");
                return 0;
            }
        }
    }

    // 一度も一致しなければ違うサイコロ
    printf("No\n");

    return 0;
}

// ダイス2つの上面が一致するまで転がす関数
// 一致していれば1を返す
int iMatchTop(DICE* pstDice1, DICE* pstDice2)
{
    int iCount; // counter

    // サイコロを7回転がせばすべての面を見られる
    for (iCount = 0; iCount <= DICE_EYES; iCount++)
    {
        // 最初の4回は左に転がす
        // 次の3回は奥に転がす
        if (iCount < 4)
        {
            vdRollE(pstDice2);
        }
        else
        {
            vdRollN(pstDice2);
        }

        // 上面が一致したら終了
        if (pstDice1->iDiceNum[DICE_TOP] == pstDice2->iDiceNum[DICE_TOP])
        {
            return 1;
        }
    }
    
    return 0;
}

// ダイス2つの上面以外が一致しているかを判定する関数
// 一致していれば1を返す
int iMatchDice(DICE stDice1, DICE stDice2)
{
    int iDiceEye; // ダイスの目
    int iCount;   // counter
    
    // 上面が一致しているダイスに関し、横面が一致しているかを回しながら判定
    for (iCount = 0; iCount < 4; iCount++)
    {
        // ダイスの目を一つずつ比較し、一つでも違えば次のループ
        for (iDiceEye = 2; iDiceEye <= DICE_EYES; iDiceEye++)
        {
            if (stDice1.iDiceNum[iDiceEye] != stDice2.iDiceNum[iDiceEye])
            {
                break;
            }
        }

        // 6つの目が一致していたらダイス一致と判定
        if (iDiceEye > DICE_EYES)
        {
            return 1;
        }
        
        // 横面を一つずらしてもう一度判定
        vdRotationL(&stDice2);
    }
    
    return 0;
}


// 正面から見て左にダイスを転がす関数
void vdRollE(DICE* pstDice)
{
    int iSwapTmp;        // 転がした際に目を変更するためのテンポラリ

    iSwapTmp = pstDice->iDiceNum[DICE_TOP];                      // 上面を退避
    pstDice->iDiceNum[DICE_TOP] = pstDice->iDiceNum[DICE_LEFT];    // 左面->上面
    pstDice->iDiceNum[DICE_LEFT] = pstDice->iDiceNum[DICE_UNDER];  // 下面->左面
    pstDice->iDiceNum[DICE_UNDER] = pstDice->iDiceNum[DICE_RIGHT]; // 右面->下面
    pstDice->iDiceNum[DICE_RIGHT] = iSwapTmp;                    // 上面->右面

    return;
}

// 正面から見て奥にダイスを転がす関数
void vdRollN(DICE *pstDice)
{
    int iSwapTmp;        // 転がした際に目を変更するためのテンポラリ

    iSwapTmp = pstDice->iDiceNum[DICE_TOP];                      // 上面を退避
    pstDice->iDiceNum[DICE_TOP] = pstDice->iDiceNum[DICE_FRONT];   // 手前->上
    pstDice->iDiceNum[DICE_FRONT] = pstDice->iDiceNum[DICE_UNDER]; // 下->手前
    pstDice->iDiceNum[DICE_UNDER] = pstDice->iDiceNum[DICE_BUCK];  // 奥->下
    pstDice->iDiceNum[DICE_BUCK] = iSwapTmp;                     // 上->奥

    return;
}

// 正面から見て左にダイスを回転させる関数
void vdRotationL(DICE *pstDice)
{
    int iSwapTmp;        // 転がした際に目を変更するためのテンポラリ

    iSwapTmp = pstDice->iDiceNum[DICE_FRONT];                      // 前を退避
    pstDice->iDiceNum[DICE_FRONT] = pstDice->iDiceNum[DICE_RIGHT]; // 右->前
    pstDice->iDiceNum[DICE_RIGHT] = pstDice->iDiceNum[DICE_BUCK];  // 奥->右
    pstDice->iDiceNum[DICE_BUCK] = pstDice->iDiceNum[DICE_LEFT];   // 左->奥
    pstDice->iDiceNum[DICE_LEFT] = iSwapTmp;                       // 前->左

    return;
}


Measured memory_bytes: 2124