def markdown_links(text):
    links = []
    i = 0
    while i < len(text):
        if text[i] == '[':
            # Check if it's an image (preceded by !)
            is_image = (i > 0 and text[i - 1] == '!')
            
            # Find the end of the label
            j = text.find(']', i + 1)
            if j == -1:
                i += 1
                continue
            
            label = text[i + 1:j]
            
            # Check for ( after ]
            if j + 1 < len(text) and text[j + 1] == '(':
                # Find the matching ) for the URL, handling balanced parens
                url_start = j + 2
                depth = 1
                k = url_start
                while k < len(text) and depth > 0:
                    if text[k] == '(':
                        depth += 1
                    elif text[k] == ')':
                        depth -= 1
                    k += 1
                
                if depth == 0:
                    url = text[url_start:k - 1]
                    if not is_image:
                        links.append((label, url))
                    i = k
                    continue
            i += 1
        else:
            i += 1
    return links
