### BUGGY CODE ###

def main():
  import sys
  input = sys.stdin.readline
  N = int(input())
  XYU = [list(map(str,input().split())) for _ in range(N)]
  from collections import deque
  INF = float('inf')

  UD = [deque() for _ in range(200001)]
  LR = [deque() for _ in range(200001)]
  UR = [deque() for _ in range(400001)]
  DL = [deque() for _ in range(400001)]
  DR = [deque() for _ in range(400001)]
  UL = [deque() for _ in range(400001)]


  for X,Y,u in XYU:
    X = int(X)
    Y = int(Y)
    if u=='R':
      LR[Y].append((X,u))
      UR[X+Y].append((Y,u))
      DR[X-Y+200000].append((Y,u))
    elif u=='L':
      LR[Y].append((X,u))
      DL[X+Y].append((Y,u))
      UL[X-Y+200000].append((Y,u))
    elif u=='U':
      UD[X].append((Y,u))
      UR[X+Y].append((Y,u))
      UL[X-Y+200000].append((Y,u))
    else:
      UD[X].append((Y,u))
      DL[X+Y].append((Y,u))
      DR[X-Y+200000].append((Y,u))

  safe = True
  ans = INF
  for l in UD:
    length = len(l)
    if length>=2:
      l = sorted(l)
      for i in range(length - 1):
        a = l[i]
        b = l[i+1]
        if (a[1]=='U')and(b[1]=='D'):
          safe = False
          ans = min(ans,(b[0] - a[0])*5)

  for l in LR:
    length = len(l)
    if length>=2:
      l = sorted(l)
      for i in range(length - 1):
        a = l[i]
        b = l[i+1]
        if (a[1]=='R')and(b[1]=='L'):
          safe = False
          ans = min(ans,(b[0] - a[0])*5)


  for l in UR:
    length = len(l)
    if length>=2:
      l = sorted(l)
      for i in range(length - 1):
        a = l[i]
        b = l[i+1]
        if (a[1]=='U')and(b[1]=='R'):
          safe = False
          ans = min(ans,(b[0] - a[0]) * 10)

  for l in DL:
    length = len(l)
    if length>=2:
      l = sorted(l)
      for i in range(length - 1):
        a = l[i]
        b = l[i+1]
        if (a[1]=='L')and(b[1]=='D'):
          safe = False
          ans = min(ans,(b[0] - a[0]) * 10)

  for l in UL:
    length = len(l)
    if length>=2:
      l = sorted(l)
      for i in range(length - 1):
        a = l[i]
        b = l[i+1]
        if (a[1]=='U')and(b[1]=='L'):
          safe = False
          ans = min(ans,(b[0] - a[0]) * 10)

  for l in DR:
    length = len(l)
    if length>=2:
      l = sorted(l)
      for i in range(length - 1):
        a = l[i]
        b = l[i+1]
        if (a[1]=='R')and(b[1]=='D'):
          safe = False
          ans = min(ans,(b[0] - a[0]) * 10)

  if safe:
    print('SAFE')
  else:
    print(ans)
    
main()

### FIXED CODE ###

def main():
  import sys
  input = sys.stdin.readline
  N = int(input())
  XYU = [list(map(str,input().split())) for _ in range(N)]
  from collections import deque
  INF = float('inf')

  UD = [0] * 200001
  LR = [0] * 200001
  UR = [0] * 400001
  DL = [0] * 400001
  DR = [0] * 400001
  UL = [0] * 400001


  for X,Y,u in XYU:
    X = int(X)
    Y = int(Y)
    if u=='R':
      if type(LR[Y])==int:
        LR[Y] = deque()
      if type(UR[X+Y])==int:
        UR[X+Y] = deque()
      if type(DR[X-Y+200000])==int:
        DR[X-Y+200000] = deque()

      LR[Y].append((X,u))
      UR[X+Y].append((Y,u))
      DR[X-Y+200000].append((Y,u))
    elif u=='L':
      if type(LR[Y])==int:
        LR[Y] = deque()
      if type(DL[X+Y])==int:
        DL[X+Y] = deque()
      if type(UL[X-Y+200000])==int:
        UL[X-Y+200000] = deque()
      LR[Y].append((X,u))
      DL[X+Y].append((Y,u))
      UL[X-Y+200000].append((Y,u))
    elif u=='U':
      if type(UD[X])==int:
        UD[X] = deque()
      if type(UR[X+Y])==int:
        UR[X+Y] = deque()
      if type(UL[X-Y+200000])==int:
        UL[X-Y+200000] = deque()
      UD[X].append((Y,u))
      UR[X+Y].append((Y,u))
      UL[X-Y+200000].append((Y,u))
    else:
      if type(UD[X])==int:
        UD[X] = deque()
      if type(DL[X+Y])==int:
        DL[X+Y] = deque()
      if type(DR[X-Y+200000])==int:
        DR[X-Y+200000] = deque()
      UD[X].append((Y,u))
      DL[X+Y].append((Y,u))
      DR[X-Y+200000].append((Y,u))

  safe = True
  ans = INF
  for l in UD:
    if type(l)!=int:
      length = len(l)
      if length>=2:
        l = sorted(l)
        for i in range(length - 1):
          a = l[i]
          b = l[i+1]
          if (a[1]=='U')and(b[1]=='D'):
            safe = False
            ans = min(ans,(b[0] - a[0])*5)

  for l in LR:
    if type(l)!=int:
      length = len(l)
      if length>=2:
        l = sorted(l)
        for i in range(length - 1):
          a = l[i]
          b = l[i+1]
          if (a[1]=='R')and(b[1]=='L'):
            safe = False
            ans = min(ans,(b[0] - a[0])*5)


  for l in UR:
    if type(l)!=int:
      length = len(l)
      if length>=2:
        l = sorted(l)
        for i in range(length - 1):
          a = l[i]
          b = l[i+1]
          if (a[1]=='U')and(b[1]=='R'):
            safe = False
            ans = min(ans,(b[0] - a[0]) * 10)

  for l in DL:
    if type(l)!=int:
      length = len(l)
      if length>=2:
        l = sorted(l)
        for i in range(length - 1):
          a = l[i]
          b = l[i+1]
          if (a[1]=='L')and(b[1]=='D'):
            safe = False
            ans = min(ans,(b[0] - a[0]) * 10)

  for l in UL:
    if type(l)!=int:
      length = len(l)
      if length>=2:
        l = sorted(l)
        for i in range(length - 1):
          a = l[i]
          b = l[i+1]
          if (a[1]=='U')and(b[1]=='L'):
            safe = False
            ans = min(ans,(b[0] - a[0]) * 10)

  for l in DR:
    if type(l)!=int:
      length = len(l)
      if length>=2:
        l = sorted(l)
        for i in range(length - 1):
          a = l[i]
          b = l[i+1]
          if (a[1]=='R')and(b[1]=='D'):
            safe = False
            ans = min(ans,(b[0] - a[0]) * 10)

  if safe:
    print('SAFE')
  else:
    print(ans)
    
main()