### BUGGY CODE ###

from itertools import accumulate
from bisect import bisect_left, bisect_right
import sys
input = sys.stdin.readline

def solve():
    INF = float('inf')

    #idEle = -INF  # max
    idEle = (-INF, -INF, -1)  # max  ### maxのインデックスを取得するために、この形式にする
    def _binOpe(x, y):
        return x if x >= y else y  # max
    def makeSegTree(numEle):
        numPow2 = 2 ** (numEle-1).bit_length()
        data = [idEle] * (2*numPow2)
        return data, numPow2
    def setInit(As):
        for iST, A in enumerate(As, numPow2):
            data[iST] = A
        for iST in reversed(range(1, numPow2)):
            data[iST] = _binOpe(data[2*iST], data[2*iST+1])
    def _update1(iA, A):
        iST = iA + numPow2
        data[iST] = A  # set
    #    data[iST] += A  # add
    def update(iA, A):
        _update1(iA, A)
        iST = iA + numPow2
        while iST > 1:
            iST >>= 1
            data[iST] = _binOpe(data[2*iST], data[2*iST+1])
    def getValue(iSt, iEn):
        L = iSt + numPow2
        R = iEn + numPow2
        ans = idEle
        while L < R:
            if L & 1:
                ans = _binOpe(ans, data[L])
                L += 1
            if R & 1:
                R -= 1
                ans = _binOpe(ans, data[R])
            L >>= 1
            R >>= 1
        return ans

    def sign(x):
        if x > 0:
            return 1
        elif x < 0:
            return -1
        else:
            return 0

    N = int(input())
    Sss = [input().rstrip() for _ in range(N)]

    Ts = []
    T0s = []
    for Ss in Sss:
        nums = [0] + [1 if S == '(' else -1 for S in Ss]
        nums = list(accumulate(nums))
        # x:最下点, y:終点との差
        x = min(nums)
        y = nums[-1] - x
        x, y = abs(x), abs(y)
        Ts.append((x, y))
        T0s.append(x)

    Ts.sort()
    T0s.sort()
    # [終点が正]を優先→[終点が負]の中では、[終点との差MAX]を選ぶ
    Us = [(sign(-x+y), y, i) for i, (x, y) in enumerate(Ts)]

    data, numPow2 = makeSegTree(N)
    setInit(Us)

    vNow = 0
    for _ in range(N):
        # 採用可能な範囲を求める
        iT0 = bisect_right(T0s, vNow)
        if iT0 == 0:
            return False
        # 範囲内のMAXのインデックスを求める
        sgn, y, i = getValue(0, iT0)
        if i == -1:
            return False
        # 現在値を更新する
        x = Ts[i][0]
        vNow += -x+y
        update(i, idEle)

    return vNow == 0


if solve():
    print('Yes')
else:
    print('No')


### FIXED CODE ###

from itertools import accumulate
import sys
input = sys.stdin.readline

def solve():
    N = int(input())
    Sss = [input().rstrip() for _ in range(N)]

    numL = numR = 0
    Pluss, Evens, Minuss = [], [], []
    for Ss in Sss:
        nums = [0] + [1 if S == '(' else -1 for S in Ss]
        nums = list(accumulate(nums))
        x = min(nums)
        y = nums[-1] - x
        x, y = abs(x), abs(y)
        if x == 0:
            numL += y
        elif y == 0:
            numR += x
        else:
            if x > y:
                Minuss.append((x, y))
            elif x < y:
                Pluss.append((x, y))
            else:
                Evens.append((x, y))

    Pluss.sort(key=lambda x: x[0])
    Minuss.sort(key=lambda x: x[1], reverse=True)

    v = numL
    for x, y in Pluss:
        v -= x
        if v < 0:
            return False
        v += y
    for x, y in Evens:
        v -= x
        if v < 0:
            return False
        v += y
    for x, y in Minuss:
        v -= x
        if v < 0:
            return False
        v += y
    v -= numR
    return v == 0


if solve():
    print('Yes')
else:
    print('No')