#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct airplane{
    int x;
    int y;
    char u;
};
int main()
{
    int n;
    cin >> n;
    vector<airplane> data;
    for(int i=0;i<n;++i){
        int x, y;
        char u;
        cin >> x >> y >> u;
        data.push_back(airplane{x, y, u});
    }

    bool safe=true;
    int ttc=1e8;

    // UDの衝突
    sort(data.begin(), data.end(), [](airplane &a, airplane &b){
        return a.x < b.x || (a.x == b.x && a.y < b.y);
    });
    int i_begin=0;
    while(i_begin<n){
        // xが等しい範囲の探索
        int i_end=i_begin;
        while(i_end<n && data[i_end].x==data[i_begin].x)++i_end;

        // u方向に走る飛行機の番号を保存
        int i_u=-1;
        for(int i_now=i_begin; i_now<i_end; ++i_now){
            if(data[i_now].u == 'U')i_u=i_now;
            else if(data[i_now].u == 'D' && i_u >= 0){
                // uが下のほうに存在して自分がdなので衝突する。相対速度は1/5
                safe=false;
                ttc = min(ttc, 5 * (data[i_now].y - data[i_u].y));
            }
        }
        i_begin=i_end;
    }

    // LRの衝突
    sort(data.begin(), data.end(), [](airplane &a, airplane &b){
        return a.y < b.y || (a.y == b.y && a.x < b.x);
    });
    i_begin=0;
    while(i_begin<n){
        // yが等しい範囲の探索
        int i_end=i_begin;
        while(i_end<n && data[i_end].y==data[i_begin].y)++i_end;

        // r方向に走る飛行機の番号を保存
        int i_r=-1;
        for(int i_now=i_begin; i_now<i_end; ++i_now){
            if(data[i_now].u == 'R')i_r=i_now;
            else if(data[i_now].u == 'L' && i_r >= 0){
                // uが下のほうに存在して自分がdなので衝突する。相対速度は1/5
                safe=false;
                ttc = min(ttc, 5 * (data[i_now].x - data[i_r].x));
            }
        }
        i_begin=i_end;
    }

    // UR, DLの衝突
    sort(data.begin(), data.end(), [](airplane &a, airplane &b){
        return a.x + a.y < b.x + b.y || (a.x + a.y == b.x + b.y && a.x < b.x);
    });
    i_begin=0;
    while(i_begin<n){
        int i_end=i_begin;
        while(i_end<n && data[i_end].x + data[i_end].y==data[i_begin].x + data[i_begin].y)++i_end;

        int i_r=-1;
        for(int i_now=i_begin; i_now<i_end; ++i_now){
            if(data[i_now].u == 'R')i_r=i_now;
            else if(data[i_now].u == 'U' && i_r >= 0){
                safe=false;
                ttc = min(ttc, 10 * (data[i_now].x - data[i_r].x));
            }
        }

        int i_d=-1;
        for(int i_now=i_begin; i_now<i_end; ++i_now){
            if(data[i_now].u == 'D')i_d=i_now;
            else if(data[i_now].u == 'L' && i_d >= 0){
                safe=false;
                ttc = min(ttc, 10 * (data[i_now].x - data[i_d].x));
            }
        }

        i_begin=i_end;
    }

    // UL, DRの衝突
    sort(data.begin(), data.end(), [](airplane &a, airplane &b){
        return a.x - a.y < b.x - b.y || (a.x - a.y == b.x - b.y && a.x < b.x);
    });
    i_begin=0;
    while(i_begin<n){
        int i_end=i_begin;
        while(i_end<n && data[i_end].x - data[i_end].y==data[i_begin].x - data[i_begin].y)++i_end;

        int i_r=-1;
        for(int i_now=i_begin; i_now<i_end; ++i_now){
            if(data[i_now].u == 'U')i_r=i_now;
            else if(data[i_now].u == 'L' && i_r >= 0){
                safe=false;
                ttc = min(ttc, 10 * (data[i_now].x - data[i_r].x));
            }
        }

        int i_d=-1;
        for(int i_now=i_begin; i_now<i_end; ++i_now){
            if(data[i_now].u == 'R')i_d=i_now;
            else if(data[i_now].u == 'D' && i_d >= 0){
                safe=false;
                ttc = min(ttc, 10 * (data[i_now].x - data[i_d].x));
            }
        }

        i_begin=i_end;
    }

    if (safe) {
        cout << "SAFE" << endl;
    }else{
        cout << ttc << endl;
    }

    return 0;
}


Measured memory_bytes: 6420